先来交代下背景吧,什么是MAC就不解释了,网上搜搜一大堆。简单来说这次MAC要上送的他方MAC的算法是ECB模式(POS终端直接模式),但在我们使用的加密机中计算MAC只支持3种模式:XOR,
ANSI x9.9, ANSI x9.19
大致上MAC算法基本都是要对待计算数据在末尾补齐0x00,使待计算数据的长度为8的倍数,随后将待计算数据每8位分组。随后对每组的数据进行操作。操作也无法是组与组之间异或,对结果使用mac
key进行单des运算。区别只是什么时候加密,怎么加密的问题了。
XOR
第一组与第二组进行以后,随后结果在于第三组进行以后,以此类推,最后的结果使用mac
key进行des加密运算,随后取结果的前半部分。
这里只用mac key加密了一次
ANSI x9.9(CBC)
异或之后每次都用mac key对异或结果进行des加密运算,运算后的结果与下一组再进行异或
ANSI x9.19
ansi x9.19的密钥必须是双倍长度了,会将mac key按8位分成左半部,右半部。异或之后每次都用左半部对异或结果进行des加密运算,运算后的结果与下一组再进行异或。最后的结果用右半部进行des解密运算,然后再用左半部进行des加密运算,最后的结果就是MAC
这是我所使用的加密机支持的算法,现在对方使用的是银联ECB算法,该算法如下:
第一组与第二组进行以后,随后结果在于第三组进行以后,以此类推,将最后的结果拉长,从8个字节拉长为16个字节,然后对前8个字节进行des加密运算,运算后的结果在和后8个字节进行一次以后,然后再对结果进行des加密运算,运算后的结果为8个字节,拉长至16个字节,取前8个字节就是MAC了。
好了,问题来了,怎么使用支持XOR, ANSI x9.9, ANSI
x9.19的加密机,最后计算出ECB算法的MAC呢?
1. 自己先对待计算数据进行补齐,分组操作
2. 第一组与第二组进行以后,随后结果在于第三组进行以后,以此类推,最后对8个字节的结果进行拉长
这样就完成了ECB算法中红框中的操作
然后使用CBC算法进行运算,把DL和DR作为待加计算数据传给加密机
红框中的D0就是DL, D1就是DR
红框中的算法就和CBC的算法是一样的了
最后只需将最终的结果拉长成16位,再截取前8个字节就是最后我们所需要的MAC了
—- 2014-12-11 —-
新一点版本的SJL05加密机是支持ECB算法的。
—- 2015-01-18 —-
把1位拉长为2位遇到一个问题,例如:0x38 0xa7
是按照 38 a7拉长为 33 38 41
37
还是按照
38 A7 拉长为33 38 61 37
答案应该是按照第二种,如果遇到英文字母,那应该是大写后再拉长
还有一点需要注意的,虽然图示中说的算法是DES,但是SJL05加密机是可以支持双倍密钥,也就是将图示中原先的DES改为3DES的,已经验证过。