C#中PACE PIN通用映射的AES-CMAC计算结果不符问题排查
PACE PIN通用映射协议AES-CMAC计算结果不符问题排查
问题概述
已完成从Hmap派生会话密钥的步骤:
Kenc = SHA1(Kshared || 00000001)Kmac = SHA1(Kshared || 00000002)
需计算认证令牌:
TPCD = MAC(Kmac, PKPICC, map)TPICC = MAC(Kmac, PKPCD, map)
参考示例实现AES-CMAC后,计算结果与PlatinumReader的已知结果不符,甚至长度不一致。
核心排查方向
1. 密钥适配性检查
SHA1输出为20字节,但AES-CMAC要求密钥为AES标准长度(16/24/32字节):
- 确认是否直接将20字节的
Kmac作为AES密钥使用?PlatinumReader可能对Kmac做了截断(取前/后16字节)或补全(用0填充至16字节)处理。 - 核对密钥长度处理逻辑是否与目标实现一致。
2. 输入数据拼接规则
验证PKPICC与map的拼接方式:
- 是直接字节流拼接
PKPICC || map,还是包含TLV长度字段等额外结构? - 检查
PKPICC、map的字节序(大端/小端)是否与PlatinumReader对齐。
3. AES-CMAC实现细节
- 确认填充规则:AES-CMAC必须使用ISO/IEC 9797-1 Padding Method 2(先补0x80,再补0x00至块长度),避免误用其他填充方式。
- 核对输出长度:默认AES-CMAC输出为16字节,检查是否存在截断(如PlatinumReader取前8字节作为令牌)的情况。
4. 关键数据验证
需提供以下数据进一步定位问题:
Kshared、Kmac的十六进制值PKPICC、map的十六进制字节流- PlatinumReader给出的
TPCD/TPICC预期结果 - C#实现中AES-CMAC核心逻辑及数据拼接的代码片段
内容的提问来源于stack exchange,提问作者Bouls
相关产品推荐
相关产品推荐

