PinBlock 演算法 使用ANSI x9 8計算

2021-08-31 10:54:45 字數 2496 閱讀 4983

pin格式

ansi x9.8 format(帶主帳號資訊)

pin block 格式等於 pin 按位異或主帳號:

pin 格式:

byte 1 pin的長度

byte 2 – byte 3/4/5/6/7 4--12個pin(每個pin佔4個bit)

byte 4/5/6/7/8 – byte 8 filler 「f」 (每個「f「佔4個bit)

主帳號格式:

byte 1 — byte 2 0x0000

byte 3 — byte 8 12個主帳號

12位主帳號的取法:取主帳號的右12位(不包括最右邊的校驗位),不足12位左補「0x00」。

例如:明文 pin 123456,

設:磁卡上的主帳號為:123456789012345678

擷取下的主帳號為:678901234567 則

用於pin加密的主帳號為:0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67

則 pin block 為 0x06 0x12 0x34 0x56 0xff 0xff 0xff 0xff

異或 0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67

結果為 0x06 0x12 0x53 0xdf 0xfe 0xdc 0xba 0x98

設:磁卡上的主帳號為:1234567890123456

擷取下的主帳號為:456789012345

則用於pin加密的主帳號為:0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45

則 pin block 為 0x06 0x12 0x34 0x56 0xff 0xff 0xff 0xff

異或 0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45

結果為 0x06 0x12 0x71 0x31 0x76 0xfe 0xdc 0xba

? pin 加密解密

省中心(外圍系統)在傳送訊息給全國中心(省中心)之前,

應用本中心的pik對pin加密後發往全國中心(省中心)。

/*** getpinblock

* 標準ansi x9.8 format(帶主帳號資訊)的pin block計算

* pin block 格式等於 pin 按位異或 主帳號;

* @param pin string

* @param accno string

* @return byte

*/private byte process(string pin, string accno)

util.printhexstring("pinblock:", arrret);

return arrret;

}/**

* gethpin

* 對密碼進行轉換

* pin格式

* byte 1 pin的長度

* byte 2 – byte 3/4/5/6/7 4--12個pin(每個pin佔4個bit)

* byte 4/5/6/7/8 – byte 8 filler 「f」 (每個「f「佔4個bit)

* @param pin string

* @return byte

*/private byte gethpin(string pin)

/*** gethaccno

* 對帳號進行轉換

* byte 1 — byte 2 0x0000

* byte 3 — byte 8 12個主帳號

* 取主帳號的右12位(不包括最右邊的校驗位),不足12位左補「0x00」。

* @param accno string

* @return byte

*/private byte gethaccno(string accno)

byte encode = new byte[8];

encode[0] = (byte) 0x00;

encode[1] = (byte) 0x00;

encode[2] = (byte) util.unitebytes(arraccno[0], arraccno[1]);

encode[3] = (byte) util.unitebytes(arraccno[2], arraccno[3]);

encode[4] = (byte) util.unitebytes(arraccno[4], arraccno[5]);

encode[5] = (byte) util.unitebytes(arraccno[6], arraccno[7]);

encode[6] = (byte) util.unitebytes(arraccno[8], arraccno[9]);

encode[7] = (byte) util.unitebytes(arraccno[10], arraccno[11]);

util.printhexstring("encoded accno:", encode);

return encode;

}

銀聯pinBlock演算法的實現

偶然翻到之前寫的對於ansi x9.8標準獲取pinblock,發現可能之前比較倉促,並沒有對整個過程描述的比較清楚,特意重新整理了下實現,新增對應注釋以便於理解該過程。1.格式化pin ansi x9.8分為帶主賬號資訊與不帶主賬號資訊,如果不帶主賬號資訊那麼下面函式處理後返回的即為pinbloc...

使用Prediction演算法

prediction演算法使用 surprise 提供了許多built in演算法.所有演算法從algobase基類繼承,當使用一些關鍵的函式時 比如predict,fit 和 test 可以從prediction algorithms包文件中獲得所有可以使用的演算法的詳細資訊 每乙個演算法都是su...

使用基礎演算法,領略演算法魅力

js 利用sort進行排序 sort可以按照元素的字元編碼的順序進行排序,條件是此元素必須為字串。對於數字排序,定義規則是很重要的。比較函式 systemsort function array 氣泡排序 bubblesort function array return array 快速排序 注意地方...