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

遵循ICAO 9303的证件外部认证返回6985响应求助

排查ICAO 9303外部认证返回6985的问题

我之前处理过类似的ICAO eMRTD外部认证问题,返回69 85(ISO 7816-4定义为"Conditions of use not satisfied")通常是安全状态不满足、命令格式错误或者密钥计算环节出了问题,结合你提供的流程和数据,咱们一步步排查:

1. 先检查EXTERNAL AUTHENTICATE命令的APDU格式

你发送的命令APDU最后指定了Le=0x28,但根据ICAO 9303的规范,外部认证成功时卡片通常只返回90 00,不需要额外数据。很多卡片不支持在这个命令中指定非0的Le值,这会触发"条件不满足"的错误。

修正方法:把Le字段改成0x00,或者直接省略Le(短APDU格式),修正后的APDU应该是:

00 82 00 00 28 E2 5F 2A A2 92 35 A3 83 32 8F FF 37 82 98 23 4B 33 BE B9 96 32 36 E1 48 CC 88 8F 05 87 8B 36 C3 DA 59 D1 84 91 A7 09 4C 00

先试试这个调整,看是否还返回6985。

2. 核对密钥推导和加密对象的正确性

你已经验证了加密函数,但还是要确认几个关键环节:

  • S的组成:你用RAND.IFD || RND_IC || K.IFD拼接成32字节的S,这符合ICAO规范,没问题。
  • K_ENC/K_MAC的生成:用K.SEED作为3DES密钥,ECB模式加密S,取前16字节为K_ENC、后16字节为K_MAC,这个逻辑是对的。建议用本地离线的3DES工具再验证一次这个步骤的输出,确保和你计算的K_ENC: 9D 80 C1 38 E5 61 6D 58 A1 94 CE CD B5 85 19 AD、K_MAC: 86 52 46 D9 E0 2F 4F F1 C7 15 8F 54 C1 F1 38 46一致。
  • E_IFD的加密对象:根据ICAO 9303-11,E_IFD是用K_ENC加密终端生成的RAND.IFD,而不是卡片返回的RND_IC。你确认加密的是RAND.IFD吗?如果搞反了加密对象,卡片验证时会直接失败,返回6985。

3. 确认K.SEED的来源正确性

K.SEED应该是从目标证件的MRZ信息推导出来的基本访问密钥(BAK),如果这个密钥本身错误,后续所有推导出来的K_ENC、K_MAC、E_IFD、M_IFD都会无效,卡片自然会拒绝认证。

请再次核对K.SEED的推导过程:是否严格按照ICAO 9303的规则,用MRZ的证件号码、有效期、出生日期计算得到?

4. 检查命令时序

有些eMRTD卡片对CHALLENGE返回的RND_IC有有效期限制,如果你在拿到RND_IC后间隔太久才发送EXTERNAL AUTHENTICATE,挑战值会过期,卡片也会返回6985。确保两个命令的发送间隔在1秒以内,避免超时。

如果以上步骤都排查过还是有问题,可以尝试换一张已知有效的测试卡,对比计算过程,定位是否是目标卡片的特殊限制或者计算细节遗漏。

内容的提问来源于stack exchange,提问作者superabsorbent polymer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:17:29