首页 > 代码库 > 加密算法

加密算法

 

十六进制字符串转化为字符算法

例如十六进制字符串为: 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

Pinkey是用来对pinblock进行加密的密钥

我们得到的一般是pinkey的密文,是通过主密钥3des加密而成的,3des的加解密可以通过openssl库来实现.

3des加解密函数: DES_ecb3_encrypt

我们通过主密钥明文对pinkey密文进行3des解密,得到pinkey明文,然后拿着pinkey明文进行pinblock的运算

Mackey

Mackey是用来对macdata进行加密的密钥,具体加密过程,参见mac运算章节

我们得到的是mackey的密文,是主密钥通过3des加密而成, 3des的加解密可以通过openssl库来实现.

3des加解密函数: DES_ecb3_encrypt

我们通过主密钥明文对mackey密文进行3des解密,得到mackey明文,然后拿着mackey明文进行mac运算

Pinblock

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

 

得到pinblock明文

对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密文

对pinblock明文使用pinkey明文通过3des加密,最终得到pinblock密文

 

Mac运算

mac是通过mackey明文使用ANSIX9.19加密生成的

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