BAC认证成功后读取智能卡二进制数据遇6A82文件未找到错误
智能卡BAC认证后DG选择返回6A82错误的解决方案
问题描述
我正在开发一款智能卡应用,已通过MRZ信息派生密钥完成Basic Access Control(BAC)流程,成功连接卡片:可正确选择Applet并收到9000响应码,完成基础认证并获取卡片挑战码。但封装Data Group(DG)选择APDU指令发送后,收到6A82“文件未找到”错误,无法读取二进制数据。
已完成操作:
- 从MRZ数据计算SEED,派生kEnc和kMac密钥;
- 成功选择Applet,响应码9000;
- 完成基础认证,获取卡片挑战码;
- 封装DG选择APDU并发送,返回6A82错误。
已尝试的排查:
- 验证APDU指令封装正确性;
- 确认Send Sequence Counter(SSC)已正确递增;
- 确认卡片连接状态为9000。
问题:
- 如何修改现有代码以成功选择DG并读取二进制数据?
- 在此场景下正确封装和发送带安全消息的APDU还有哪些注意事项?
问题1:修改代码以成功选择DG并读取数据
1. 校验DG文件ID的准确性
不同智能卡(如ePassport、区域eID)的DG文件ID存在差异,禁止硬编码固定值。例如ePassport的DG1 ID为0101、DG2为0102,但部分地区eID可能采用不同ID段。需通过读取卡片MF(主文件)或目标DF(专用文件)下的FCI(文件控制信息),确认卡片实际支持的DG列表,再使用对应ID。
2. 修正DG选择APDU格式
选择DG的标准APDU格式应为:
00 A4 02 0C 02 [DG_ID]
参数说明:
00:原始CLA(指令类别),后续封装安全消息时需调整CLA字段;A4:INS(选择文件指令);02:P1(选择子文件);0C:P2(返回FCI);02:LC(DG ID的字节长度,固定为2字节);[DG_ID]:2字节的目标DG文件ID。
若格式错误(如P1/P2设置错误、DG ID长度不符),会直接触发6A82错误。
3. 确认DF上下文切换
选择Applet后,需切换至对应DG所在的DF上下文。以ePassport为例:
- 选择Applet(如APDU:
00 A4 04 0C 07 A0000002471001); - 切换至DF01(APDU:
00 A4 01 0C 02 0100); - 再发送DG选择指令。
若未切换至正确DF,直接选择DG会因上下文错误导致文件未找到。
4. 完善安全消息封装逻辑
BAC认证后,所有APDU必须封装为安全消息(含MAC校验,无数据域时无需加密):
- 计算MAC时,需包含SSC、完整原始APDU指令、kMac密钥,严格遵循ISO/IEC 9797-1算法;
- 确保SSC在每次发送安全消息后无符号32位递增,且与卡片端同步;
- 封装后的CLA需设置为
0C(仅含MAC)或04(含加密+MAC),匹配卡片要求。
问题2:带安全消息的APDU封装与发送注意事项
- SSC严格同步:终端与卡片的SSC必须完全一致,每次发送安全消息后终端需主动递增SSC。若同步失败,卡片会返回6982(安全状态不满足),需重新执行BAC流程。
- 封装顺序合规:先构造原始APDU,再计算MAC(SSC + APDU命令 + kMac),最后将MAC附加到APDU后,遵循TS 102 201等行业标准格式。
- CLA字段匹配要求:根据卡片支持的安全消息类型设置CLA,错误的CLA会导致卡片无法解析安全消息,触发各类错误。
- 密钥派生准确性:从MRZ计算SEED时,需确保MRZ校验位计算正确,SEED派生(如SHA-1)、kEnc/kMac生成严格符合ISO规范。密钥错误会导致BAC认证后安全消息校验失败,引发隐性错误。
- 长度限制合规:封装后的APDU总长度不得超过卡片支持的最大传输长度(通常为255字节),超长需分块处理(DG选择指令一般无需分块)。
- 错误重试逻辑:收到6982时需重新执行BAC同步SSC;收到6A82优先检查DG ID、DF上下文、APDU格式;其他安全类错误需校验密钥或封装流程。
内容的提问来源于stack exchange,提问作者Shehab
相关产品推荐
相关产品推荐

