偶然翻到之前寫的對於ansi x9.8標準獲取pinblock,發現可能之前比較倉促,並沒有對整個過程描述的比較清楚,特意重新整理了下實現,新增對應注釋以便於理解該過程。
1.格式化pin(ansi x9.8分為帶主賬號資訊與不帶主賬號資訊,如果不帶主賬號資訊那麼下面函式處理後返回的即為pinblock)
2.下面為處理主賬號資訊/**
* 格式化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;
}
3.下面為呼叫上面兩個函式異或後獲取帶主賬號資訊的pinblock(ansi x9.8分帶主賬號資訊)/**
* 格式化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;
}
經過上面運算得到明文的pinblock,然後通過pin金鑰加密就可以得到密文pinblockbyte pan = formartpan(pan);
byte pin = formatpinbyx98(pin);
for (int i = 0; i < pin.length; i++)
//異或完後執行加密,以下邏輯可根據自己實際需求處理
以上函式 傳入的 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...