先来交代下背景吧,什么是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算法通过CBC来实现ECB

异或之后每次都用mac key对异或结果进行des加密运算,运算后的结果与下一组再进行异或
ANSI x9.19

MAC算法通过CBC来实现ECB

ansi x9.19的密钥必须是双倍长度了,会将mac key按8位分成左半部,右半部。异或之后每次都用左半部对异或结果进行des加密运算,运算后的结果与下一组再进行异或。最后的结果用右半部进行des解密运算,然后再用左半部进行des加密运算,最后的结果就是MAC
这是我所使用的加密机支持的算法,现在对方使用的是银联ECB算法,该算法如下:

MAC算法通过CBC来实现ECB

第一组与第二组进行以后,随后结果在于第三组进行以后,以此类推,将最后的结果拉长,从8个字节拉长为16个字节,然后对前8个字节进行des加密运算,运算后的结果在和后8个字节进行一次以后,然后再对结果进行des加密运算,运算后的结果为8个字节,拉长至16个字节,取前8个字节就是MAC了。
好了,问题来了,怎么使用支持XOR, ANSI x9.9, ANSI x9.19的加密机,最后计算出ECB算法的MAC呢?
1. 自己先对待计算数据进行补齐,分组操作 2. 第一组与第二组进行以后,随后结果在于第三组进行以后,以此类推,最后对8个字节的结果进行拉长
这样就完成了ECB算法中红框中的操作

MAC算法通过CBC来实现ECB

然后使用CBC算法进行运算,把DL和DR作为待加计算数据传给加密机

MAC算法通过CBC来实现ECB

红框中的D0就是DL, D1就是DR

MAC算法通过CBC来实现ECB

红框中的算法就和CBC的算法是一样的了
最后只需将最终的结果拉长成16位,再截取前8个字节就是最后我们所需要的MAC了
—- 2014-12-11 —- 新一点版本的SJL05加密机是支持ECB算法的。

MAC算法通过CBC来实现ECB

—- 2015-01-18 —- 把1位拉长为2位遇到一个问题,例如:0x38 0xa7 是按照 38 a7拉长为 33 38 41 37 还是按照    38 A7 拉长为33 38 61 37
答案应该是按照第二种,如果遇到英文字母,那应该是大写后再拉长
还有一点需要注意的,虽然图示中说的算法是DES,但是SJL05加密机是可以支持双倍密钥,也就是将图示中原先的DES改为3DES的,已经验证过。

MAC算法通过CBC来实现ECB

记一次向maven中央仓库提交依赖包

阅读目录 提交工单Maven相关配置配置gpg-key部署发布参考资料 Maven是Java中最常用的依赖管理工具,Maven的中央仓库保罗万象,涵盖了各个领域的框架、...

阅读全文

Spring Boot : 使用 Zuul 实现 API Gateway 的路由和过滤 ( Routing and Filtering )

Spring Boot : 使用 Zuul 实现 API Gateway 的路由和过滤 ( Routing and Filtering ) image.png 本节通过使用 Netflix Zuul 实现微服应用中的...

阅读全文

docker安装DOClever接口项目管理

DOClever是一个商业化开源产品,完全免费。无论你是前端工程师,还是后端工程师,接口永远都是两者交互的桥梁,所以DOClever专为中小型团队量身打造,旨在解...

阅读全文

欢迎留言