銀聯pinBlock演算法的實現

2021-07-30 02:14:53 字數 1497 閱讀 9806

偶然翻到之前寫的對於ansi x9.8標準獲取pinblock,發現可能之前比較倉促,並沒有對整個過程描述的比較清楚,特意重新整理了下實現,新增對應注釋以便於理解該過程。

1.格式化pin(ansi x9.8分為帶主賬號資訊與不帶主賬號資訊,如果不帶主賬號資訊那麼下面函式處理後返回的即為pinblock)

/**

* 格式化pin

** @param pin

* @return

*/public static byte formatpinbyx98(byte pin)

//固定為8位元組長度

byte encode = new byte[8];

//規範要求不足8自己後補f,先提前補好填充內容方便後面處理

arrays.fill(encode, (byte) 0xff);

//第一位為pin長度

encode[0] = (byte) l;

//計算填充剩餘位元組(填充規則,按照bcd壓縮碼填充,即乙個位元組可以表示2位密碼

// 這裡因為乙個位元組長度為8位,密碼確定為0-9中任意數字,這代表用4bit即可完全表示一位密碼,所以乙個位元組可以表示兩位密碼。

// 需要注意的是為無符號位的位元組,所以填充前我們需要運用按位運算與0x0f運算去掉符號位)

int cl = l / 2;

for (int i = 0; i < cl; i++) }}

return encode;

}

2.下面為處理主賬號資訊

/**

* 格式化pan

** @param pan

* @return

*/private byte formartpan(byte pan)

//固定為8位元組長度

byte encode = new byte[8];

int cl = pan.length / 2;

//前面2位元組固定填充為0x00

encode[0] = 0x00;

encode[1] = 0x00;

//計算填充剩餘位元組(填充規則,按照bcd壓縮碼填充,即乙個位元組可以表示2位卡號(原因同pin)

for (int i = 0; i < cl; i++)

return encode;

}

3.下面為呼叫上面兩個函式異或後獲取帶主賬號資訊的pinblock(ansi x9.8分帶主賬號資訊)

byte pan = formartpan(pan);

byte pin = formatpinbyx98(pin);

for (int i = 0; i < pin.length; i++)

//異或完後執行加密,以下邏輯可根據自己實際需求處理

經過上面運算得到明文的pinblock,然後通過pin金鑰加密就可以得到密文pinblock

以上函式 傳入的   pan  和 pin  均為ascii。

銀聯加密演算法

非常多人對銀聯卡的加密演算法感興趣,畢竟分分鐘涉及的都是你的錢的安全,但網上非常少人卻講銀聯標準加密演算法。遂寫一遍當做是自己的學習筆記。偶爾忘了能夠翻翻,同一時候希望能夠幫助到其它人。首先要認識一下cbc演算法和ecb演算法。cbc演算法是鏈式的。慢。不可並行處理,但更安全,由於每一次加密都是依賴...

php實現銀聯支付

銀聯支付用的還是比較少的,而且開發中也沒接觸多少,不過因為工作專案用銀聯支付能降低費率,所以還是接入了銀聯支付。本文支付為銀聯閘道器和wap支付介面。官方 sdk demo 產品api api文件 在開始之前要仔細閱讀官方包裡的說明檔案,必要的證書和商戶資訊要提前獲取。例項 及步驟 修改demo a...

APICloud系列 37 銀聯支付的實現

正式使用請與銀聯簽約 端呼叫方法 xlunionpay api.require xlunionpay xlunionpay xlunionpay callback ret,err params spid 銀聯保留引數,預設為null android用 sysprovider 銀聯保留引數,預設為nu...