现在的位置: 首页 > 综合 > 正文

一般算des mac的方法

2014年03月14日 ⁄ 综合 ⁄ 共 2069字 ⁄ 字号 评论关闭

Mac算法

 

1)数据域长度 = 数据域长度 + 4

2)整个指令补上80,如果补无80后不是8的整数倍,用00补齐到8的整数倍

3)随机数不够8字节用00补齐8字节

4)用随机数与整个指令的第1组8个字节进行异或,用密钥进行加密,加密结果作为新随机数

5)随机数与整个指令的下一组(对于第1组来说是第2组8个字节进行异或,用密钥进行加密,加密结果作为新随机数

6)重复第5步,直到所有的数据都计算完毕。

7)最后一组数据的加密结果的前4个字节就是mac。

8)将mac添加到原始数据的后面形成完整的apdu。

 

注意:密钥有8字节以及16字节的差别,这两种密钥的差别在最后一组,

如果密钥是8字节,那么所有的数据加密都使用这8个字节来计算,

如果密钥是16字节,那么不是最后一组的要使用密钥的前8个字节做des加密,最后一组使用16个字节的密钥做3des加密

如果第一组就是最后一组且密钥是16字节,则直接使用16字节密钥做3des运算。

 

例1:

随机数 01020304

密钥   1122334455667788

指令   84 ee 00 00 02 3f 00

 

1)  变成 84 EE 00 00 06 3F 00

2)  84 EE 00 00 06 3F 00 80

3)  01 02 03 04 00 00 00 00

4)  Xor    01 02 03 04 00 00 00 00   84 EE 00 00 06 3F 00 80 得到结果85 EC 03 04 06 3F 00 80   

5)  加密 第4步得到的结果 = 1F 91 C6 04 85 A0 EE 16

6)  最终结果 是 1F 91 C6 04

7)  最终指令为 84 EE 00 00 06 3F 00 1F 91 C6 04

 

2:密钥为8字节

 

 

//des_des_mac ( 01020304 , fixed80_len ( 84 ee 00 00 < 3f 00 1122334455667788 1122 > , int ( 8 ) ) , 1122334455667788 )

//------int

//------  input = 08  hex = 00 00 00 08

//

//----fixed80_len fixed fill 80 00 ... after the data to multiple of len

//----  input = 84 EE 00 00 10 3F 00 11 22 33 44 55 66 77 88 11 22

//----  output = 84 EE 00 00 10 3F 00 11 22 33 44 55 66 77 88 11 22 80 00 00 00 00 00 00

//

//--des_des_mac

//--key = 11 22 33 44 55 66 77 88

//--icv = 01 02 03 04 00 00 00 00   plain = 84 EE 00 00 10 3F 00 11

//--xor = 85 EC 03 04 10 3F 00 11   cipher = F5 E8 11 E7 83 5E B2 B7

//--icv = F5 E8 11 E7 83 5E B2 B7   plain = 22 33 44 55 66 77 88 11

//--xor = D7 DB 55 B2 E5 29 3A A6   cipher = 57 87 9F C5 70 62 C1 3A

//--icv = 57 87 9F C5 70 62 C1 3A   plain = 22 80 00 00 00 00 00 00

//--xor = 75 07 9F C5 70 62 C1 3A   cipher = BD 92 D9 D0 5D E3 72 DC

//

//-----Final result --- BD 92 D9 D0

//

//

 

 

例3:密钥为16字节

 

 

//3des_des_mac ( 01020304 , fixed80_len ( 84 ee 00 00 < 3f 00 1122334455667788 1122 > , int ( 8 ) ) , 1122334455667788 8877665544332211 )

//------int

//------  input = 08  hex = 00 00 00 08

//

//----fixed80_len fixed fill 80 00 ... after the data to multiple of len

//----  input = 84 EE 00 00 10 3F 00 11 22 33 44 55 66 77 88 11 22

//----  output = 84 EE 00 00 10 3F 00 11 22 33 44 55 66 77 88 11 22 80 00 00 00 00 00 00

//

//--3des_des_mac

//--key = 11 22 33 44 55 66 77 88 88 77 66 55 44 33 22 11

//--icv = 01 02 03 04 00 00 00 00   plain = 84 EE 00 00 10 3F 00 11

//--xor = 85 EC 03 04 10 3F 00 11   cipher = 90 F9 5B E5 2B 57 DB E2

//--icv = 90 F9 5B E5 2B 57 DB E2   plain = 22 33 44 55 66 77 88 11

//--xor = B2 CA 1F B0 4D 20 53 F3   cipher = C5 0C 86 87 1A BA 15 2F

//--icv = C5 0C 86 87 1A BA 15 2F   plain = 22 80 00 00 00 00 00 00

//--xor = E7 8C 86 87 1A BA 15 2F   cipher = A5 B9 8C 3E 89 F1 07 D7

//

//-----Final result --- A5 B9 8C 3E

//

 

 

 

 

抱歉!评论已关闭.