使用32字节密钥建立SCP03安全通道遇验证失败求正确参数
SCP03会话密钥生成与卡片密码验证的正确参数
一、会话密钥派生的正确输入参数与流程
你的核心错误集中在输入数据格式、L值配置以及会话密钥长度处理上,以下是符合GlobalPlatform规范的正确步骤:
1. 输入数据结构(固定长度22字节)
派生会话密钥(ENC/MAC/R-MAC)的输入数据必须严格遵循以下格式:
0x00 || KDC || 0x00 || L || 0x02 || Host_Challenge(8字节) || Card_Challenge(8字节)
各字段说明:
0x00:1字节前缀(不是11个0,这是你第一个错误点)KDC:1字节密钥派生常量:- 0x04 → 会话加密密钥(ENC)
- 0x06 → 会话MAC密钥(MAC)
- 0x07 → 会话R-MAC密钥(R-MAC)
0x00:1字节分隔符L:2字节大端值,代表派生后会话密钥的字节长度。你的静态密钥是32字节(AES-256),所以L为0x0020(对应32字节,你之前用的0x0100完全错误,这是第二个错误点)0x02:1字节常量(代表SCP03密钥派生版本)Host_Challenge:8字节主机发送的随机挑战值Card_Challenge:8字节卡片返回的随机挑战值
2. 32字节会话密钥的派生计算
由于静态密钥是32字节(AES-256),会话密钥需通过两次CMAC计算拼接生成:
- 第一步:用静态派生密钥(DK)计算「输入数据 + 0x01」的CMAC,得到16字节CMAC1
- 第二步:用同样的DK计算「输入数据 + 0x02」的CMAC,得到16字节CMAC2
- 最终会话密钥 = CMAC1 || CMAC2(总长度32字节,你之前用16字节MAC密钥是错误的,这是第三个错误点)
二、卡片密码验证的正确参数与计算
卡片密码(8字节)的验证需使用32字节的会话MAC密钥,对指定数据计算CMAC后取前8字节,再与卡片返回值对比:
1. 待计算MAC的数据结构(固定长度22字节)
0x80 || Card_Challenge(8字节) || Host_Challenge(8字节) || Sequence_Counter(2字节) || 0x0000
各字段说明:
0x80:1字节常量Card_Challenge:卡片返回的8字节挑战值Host_Challenge:主机发送的8字节挑战值Sequence_Counter:2字节大端值,卡片在初始化更新响应中返回的序列计数器0x0000:2字节填充值
2. 计算与验证步骤
- 用32字节的会话MAC密钥对上述22字节数据计算AES-256 CMAC(遵循NIST规范)
- 取计算得到的16字节CMAC的前8字节,与卡片返回的8字节密码逐字节对比,一致则验证通过
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

