JAVA card 应用开发(九)APDU脚本命令中MAC的校验

JAVA card 应用开发(九)APDU脚本命令中MAC的校验



终端从后台接收到71或72脚本,解析出脚本指令,发给卡片。
卡片执行该脚本指令,首先要验证MAC,MAC验证通过,才真正执行脚本。因为脚本一般都是更新数据,锁定/解锁应用等敏感操作,所以必须有MAC进行保护。


MAC数据计算的大致过程为:
发卡行有主密钥。在发卡的时候,发卡行把主密钥根据卡号分散,卡片得到分散密钥。交易过程中,发卡行接收到包含卡号的交易数据,通过主密钥,根据卡号得到分散密钥,根据ATC和分散密钥,得到过程密钥,使用过程密钥加密数据,得到MAC。而卡片本身已经存储有分散密钥,在交易过程中,根据ATC和分散密钥,计算得到过程密钥,使用过程密钥校验MAC是否正确。


在我的博文《TC、ARQC、AAC及ARPC校验方式》中,可以看到分散密钥和过程密钥如何计算得到。


下面举两例子:


分散密钥:8B4F854F0831FBF2635A212E4DDDB92A


例子一:
通过国密算法计算过程密钥:
ATC:  0003
分散数据: 0000000000000003000000000000FFFC
SM4的加密结果:B6FA9E085B5773C1E3AA2E4738831F73(过程密钥)
比如是一个PUT DATA的脚本(也就是圈存):
04DA9F790A00000010009995FD68F5(后面四个字节就是MAC数据)
计算MAC:
04DA9F790A + 2字节ATC + 8字节应用密文 + 17字节(命令后续的内容 + 80000....)
04DA9F790A000335304180BE2CBD3F0000001000998000000000000000000000(对这串数据计算MAC,就可以得到MAC数据:95FD68F5


例子二:
过程密钥
ATC 0004
分散数据:0000000000000004000000000000FFFB
SM4加密结果,也就是过程密钥:836A6E56E99296E68941819EEE72A7F7
脚本:应用锁定
841E000004 AF04EDD8
计算MAC:
841E000004 + 2字节ATC + 8字节应用密文 + 17字节(因为没有后续内容,直接这里是填充成16字节的倍数)
841E0000040004AC0494D24AF1D6B180(对这串数据计算MAC,就得到MAC数据:AF04EDD8)。


说明:《JAVA card 应用开发》系列博文是我在学习Java卡过程中的记录,有不对的地方,请指出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值