You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:32:33