MIFARE DESFire EV2卡读写求助:ACR1252U APDU命令报错63 00
核心问题定位
你之前用的FF 82、FF 86、FF B0都是MIFARE Classic普通IC卡的专属命令,但MIFARE DESFire EV2是基于ISO 14443-4的智能卡,完全不兼容这类指令,这就是返回63 00错误的根本原因。
一、MIFARE DESFire EV2核心概念解释
- AID(应用标识符):DESFire卡采用「应用-文件」分层结构,每个应用对应一个唯一的AID(3-16字节),相当于卡内的独立加密分区,不同应用可以配置不同的密钥和文件规则。
- 文件:每个应用下可创建多种类型文件(二进制文件、线性记录文件等),你要传输的少量二进制数据就存在二进制文件中。
- 操作逻辑:必须先通过AID选中目标应用,再选中该应用下的具体文件,完成对应应用的认证后,才能执行读写操作。
二、ACR1252U读写DESFire EV2的正确流程(结合pyscard)
你的前期初始化命令(开启透明会话、激活天线、ISO14443-4A模式)已经返回90 00,说明透明传输通道正常,接下来直接转发DESFire原生命令即可,无需再用MIFARE Classic指令。
分步操作及APDU说明
1. 获取卡UID(可选,确认卡连接正常)
通过透明通道发送DESFire的「获取UID」命令:
# APDU格式:FF C2 00 00 [命令长度] [DESFire命令字节] # DESFire Get UID命令码为0x60 apdu = [0xFF, 0xC2, 0x00, 0x00, 0x01, 0x60] response, sw1, sw2 = connection.transmit(apdu) # 正常返回:UID字节数组 + 状态码90 00
2. 应用认证(以默认应用AID 0x000000、默认密钥0xFFFFFFFFFFFF为例)
新手推荐先使用明文认证模式(默认卡一般开启),步骤如下:
# DESFire明文认证命令码为0x1A,参数:密钥号(0x00) + 6字节密钥 apdu = [0xFF, 0xC2, 0x00, 0x00, 0x08, 0x1A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] response, sw1, sw2 = connection.transmit(apdu) # 返回90 00表示认证成功;若返回63 00则密钥不匹配或卡不支持明文认证
3. 选择目标应用
选中默认应用(AID为0x000000):
# DESFire选择应用命令码为0x5A,参数:3字节AID apdu = [0xFF, 0xC2, 0x00, 0x00, 0x04, 0x5A, 0x00, 0x00, 0x00] response, sw1, sw2 = connection.transmit(apdu) # 返回90 00表示应用选中成功;自定义AID替换后3字节即可
4. 创建二进制文件(如卡内无现成文件)
创建一个ID为0x01、大小32字节的二进制文件:
# DESFire创建标准数据文件命令码为0xCD # 参数:文件ID(0x01) + 通信设置(0x00) + 访问权限(0x0000) + 文件大小(0x000020) apdu = [0xFF, 0xC2, 0x00, 0x00, 0x07, 0xCD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20] response, sw1, sw2 = connection.transmit(apdu) # 返回90 00表示文件创建成功
5. 写入二进制数据
往文件ID 0x01的偏移0处写入16字节数据(示例为0x01到0x10):
# DESFire写数据命令码为0x3D # 参数:文件ID(0x01) + 偏移量(0x0000) + 数据长度(0x10) + 数据内容 data = list(range(1, 17)) # 示例数据:[1,2,...,16] apdu = [0xFF, 0xC2, 0x00, 0x00, 0x06 + len(data)] + [0x3D, 0x01, 0x00, 0x00, 0x10] + data response, sw1, sw2 = connection.transmit(apdu) # 返回90 00表示写入成功
6. 读取二进制数据
从文件ID 0x01的偏移0处读取16字节:
# DESFire读数据命令码为0xBD # 参数:文件ID(0x01) + 偏移量(0x0000) + 读取长度(0x10) apdu = [0xFF, 0xC2, 0x00, 0x00, 0x06, 0xBD, 0x01, 0x00, 0x00, 0x10] response, sw1, sw2 = connection.transmit(apdu) # 正常返回:读取的16字节数据 + 状态码90 00
三、关键注意事项
- 透明传输格式:所有DESFire原生命令必须通过
FF C2 00 00 [命令总长度] [DESFire命令+参数]的格式转发给ACR1252U,这是阅读器转发卡命令的标准格式。 - 密钥匹配:如果卡的应用密钥不是默认的
FFFFFFFFFFFF,必须替换为实际密钥,否则认证会失败。 - 错误码排查:
63 00多为命令不兼容或认证失败;69 82表示权限不足,需检查是否完成认证或密钥是否正确。
四、参考文档
- 《MIFARE DESFire EV2 Datasheet》:官方核心文档,包含所有原生命令格式、认证流程、文件系统操作细节。
- 《ACR1252U API Reference》:重点查看「Transparent Session(透明会话)」章节,掌握卡原生命令的转发规则。
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

