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卡过程中的记录,有不对的地方,请指出。
JAVA card 应用开发(九)APDU脚本命令中MAC的校验
原文地址:http://blog.csdn.net/freud_lv/article/details/39156847