例如十六进制字符串为: 138CE5B32C0E9126C291E970EA98764C
那么,两位十六进制合成一个字符:13(hex)->1*16+3=19,那么字符的整数形式则为19
例如字符的整数形式为17->17/16,17%16->11(hex)
主密钥是有三组分量的,一个分量为8位,则主密钥的长度为24位
但是目前机端只支持两组分量,那么密钥的第三个分量则使用第一个分量的值来合成24位的密钥(名称为3des双倍长)
明文分量1 :138CE5B32C0E9126C291E970EA98764C
明文分量2 :1FD3C2437F6EE6DCD9383E1A49E9674C
成份1校验值:FA16CB
成份2校验值:906256
合成后校验值:9BAE3E
加密后的主密钥: 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