例如十六進制字符串爲: 138CE5B32C0E9126C291E970EA98764C算法
那麼,兩位十六進制合成一個字符:13(hex)->1*16+3=19,那麼字符的整數形式則爲19函數
例如字符的整數形式爲17->17/16,17%16->11(hex)加密
主密鑰是有三組份量的,一個份量爲8位,則主密鑰的長度爲24位spa
可是目前機端只支持兩組份量,那麼密鑰的第三個份量則使用第一個份量的值來合成24位的密鑰(名稱爲3des雙倍長)3d
明文份量1 :138CE5B32C0E9126C291E970EA98764Cssl
明文份量2 :1FD3C2437F6EE6DCD9383E1A49E9674Cci
成份1校驗值:FA16CB字符串
成份2校驗值:906256openssl
合成後校驗值:9BAE3Etable
加密後的主密鑰: C24CC457EEA2ACB556DB514BFF15AE0B
主密鑰明文 = 明文份量1 異或 明文份量2
根據上面的數據,主密鑰明文爲0C5F27F0536077FA1BA9D76AA3711100
Pinkey是用來對pinblock進行加密的密鑰
咱們獲得的通常是pinkey的密文,是經過主密鑰3des加密而成的,3des的加解密能夠經過openssl庫來實現.
3des加解密函數: DES_ecb3_encrypt
咱們經過主密鑰明文對pinkey密文進行3des解密,獲得pinkey明文,而後拿着pinkey明文進行pinblock的運算
Mackey是用來對macdata進行加密的密鑰,具體加密過程,參見mac運算章節
咱們獲得的是mackey的密文,是主密鑰經過3des加密而成, 3des的加解密能夠經過openssl庫來實現.
3des加解密函數: DES_ecb3_encrypt
咱們經過主密鑰明文對mackey密文進行3des解密,獲得mackey明文,而後拿着mackey明文進行mac運算
Pinblock是使用卡號和密碼進行運算獲得的一串字符.
例如密碼爲123456
壓縮成8位字符串
0->6 //密碼位數
1->18 //密碼第一位1*16加上密碼第二位2 ->1*16+2=18
2->52 //密碼第三位3*16加上密碼第四位4 ->3*16+4=52
3->86 //密碼第五位5*16加上密碼第六位6 ->5*16+6=86
4->255 //固定值
5->255 //固定值
6->255 //固定值
7->255 //固定值
獲得密碼8位串PASSWORD_STR:
6 |
18 |
52 |
86 |
255 |
255 |
255 |
255 |
取賬號右12位(不包括最後一位校驗位),不足12位右補0x00,而後對12位進行壓縮成8位字符串
例如賬號爲00123456789012
壓縮成8位字符串
0->0 //固定爲0
1->0 //固定爲0
2->18 //第一位1*16加上第二位2 ->1*16+2=18
3->52 //第三位3*16加上第四位4 ->3*16+4=52
4->86 //……
5->120 //……
6->144 //……
7->18 //……
獲得賬號8位串ACCOUNTNO_STR
0 |
0 |
18 |
52 |
86 |
120 |
144 |
18 |
對ACCOUNTNO_STR異或PASSWORD_STR
PASSWORD_STR |
6 |
18 |
52 |
86 |
255 |
255 |
255 |
255 |
ACCOUNTNO_STR |
0 |
0 |
18 |
52 |
86 |
120 |
144 |
18 |
pinblock明文 |
6 |
18 |
53 |
117 |
186 |
152 |
118 |
254 |
獲得pinblock明文: 06123575BA9876FE
對pinblock明文使用pinkey明文經過3des加密,最終獲得pinblock密文
mac是經過mackey明文使用ANSIX9.19加密生成的
密鑰長度爲32位(hex格式)
程序獲得macdata串,若是macdata串長度不爲8的倍數,則右補0x00,補夠8的倍數
設置初始向量E0= x00x00x00x00x00x00x00x00(八位0)
把macdata串分紅每組8位:D1,D2,D3……DN
使用向量跟macdata的八位串進行異或E0^D1->F-->使用密鑰左16位進行DES加密-->E1
E1^D2----->E2
…….
E(N-1)^DN---->EN
使用密鑰右16位對EN進行DES解密,獲得En0
使用密鑰左16位對EN進行DES加密,獲得En1
En1爲最終的mac
des加解密函數: DES_ecb_encrypt