智能卡APDU安全消息MAC计算错误求助
智能卡APDU安全消息MAC计算错误求助
大家好,我现在在构造智能卡的安全消息时遇到了MAC计算不符的问题,按照示例步骤操作后得到的MAC值和预期结果对不上,想请各位帮忙看看哪里出错了!
先给大家列一下基础数据:
- 原始Plain APDU:
00 A4 00 00 - 预期正确的kSMac:
2F 34 E0 0D 1C 46 76 67 43 BA 6B 26 AB 20 4F D3 - SSC(发送序列计数器):
20 29 73 0A 6D 5E 7C C4
我的操作步骤如下:
- 先修改APDU的第一个字节,得到修改后的APDU:
byte[] modifiedAPDU = new byte[] { 0x0C, 0xA4, 0x00, 0x00 };
- 对修改后的APDU执行填充操作:
byte[] paddedAPDU = Pad(modifiedAPDU);
- 将SSC和填充后的APDU拼接在一起,顺序是SSC在前,填充后的APDU在后:
byte[] apduWithSSC = new byte[SSC.Length + paddedAPDU.Length]; Array.Copy(SSC, apduWithSSC, SSC.Length); Array.Copy(paddedAPDU, 0, apduWithSSC, SSC.Length, paddedAPDU.Length);
我还打印了拼接后的内容用于校验:
Console.WriteLine("APDU with SSC: " + BitConverter.ToString(apduWithSSC).Replace("-", ""));
- 最后调用自定义的
CalculateMac方法计算MAC:
byte[] mac = CalculateMac(apduWithSSC, kSMac);
下面是CalculateMac方法的部分实现:
static byte[] CalculateMac(byte[] data, byte[] key) { // Initialize DES engine DesEngine desEngine = new DesEngine(); // Initialize ISO9797Alg3Mac with DES engine, 64-bit block size, and ISO7816d4Padding // 后续的初始化和计算逻辑我就不贴全了,但目前得到的MAC和预期值完全对不上 }
我对照着示例一步步操作,但就是得不到正确的MAC值,有没有大佬能帮我排查下可能的问题点?比如填充方式是否符合规范、拼接顺序是不是搞反了,或者MAC算法的初始化参数有没有哪里配置错了?
备注:内容来源于stack exchange,提问作者Malata
相关产品推荐
相关产品推荐

