基于GlobalPlatform SCP03规范:无法生成匹配eUICC的卡片密码
问题分析与修正方案
看起来你在SCP03卡片密码验证时踩了几个规范细节的坑,我帮你梳理一下关键错误点和修正步骤:
1. 会话密钥S-MAC派生的参数错误
你当前计算S-MAC时用了错误的derivationConstant和L值:
- 派生常量混淆:根据GlobalPlatform SCP03 v2.3 Amendment D规范,S-MAC会话密钥的派生常量是
0x06(你用的0x00是S-ENC的派生常量)。所以Label应该是11个00+06,即000000000000000000000006。 - 密钥长度L错误:你的母密钥是16字节(128位),所以L值应该是
0080(表示128位),而不是0040(对应64位)。
修正后的S-MAC派生输入数据应为:
000000000000000000000006 00 0080 01 AF6B2B0E174BA140E7359F8EEC577E51
用这个输入和母密钥AA75D7A83CF20FE79C606FF1B7E2CEB4计算CMAC,就能得到正确的S-MAC会话密钥。
2. 卡片密码的计算逻辑错误
你现在误用了密钥派生的输入格式来计算卡片密码,这完全不符合规范!卡片密码的计算逻辑是直接用S-MAC会话密钥对固定格式的数据做CMAC,取前8字节。
正确的卡片密码输入数据格式是:
00 [HostChallenge] [CardChallenge] [SequenceNumber]
代入你的参数后具体为:
00 AF6B2B0E174BA140 E7359F8EEC577E51 000007
用修正后的S-MAC密钥计算这个数据的CMAC,取前8字节就应该和eUICC返回的86B91FBEA0E67D33匹配了。
3. 额外检查点
- 确认所有多字节字段(比如Sequence Number、L值)都采用大端(Big-Endian)字节序,这是GlobalPlatform规范的默认要求。
- 验证母密钥配置:你标注了
keyMAC = keyENC = AA75D7A83CF20FE79C606FF1B7E2CEB4,虽然部分场景下母密钥会复用,但要确认目标eUICC确实配置为MAC和ENC母密钥相同,否则派生的会话密钥也会出错。
按照以上步骤修正后,应该就能得到匹配的卡片密码了。
内容的提问来源于stack exchange,提问作者Satan
相关产品推荐
相关产品推荐

