我是 APDU 的新手。我阅读了 DESFire 的数据表。根据它我们有:
CLA = 0x90
INS = DESFire CMD Code
P1 = 0x00
P2 = 0x00
LC = Length of wrapped Data
data = DESFire command parameter(s)
LE = 0x00
我想获取 DESFire UID,但无法为此创建命令 APDU。 任何人都可以引导我走向正确的方向吗?我创建了这个 APDU,但我不确定它是否正确:
byte[8] cmd_apdu_getUID_part1= {0x90 , 0x93 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00};
而且我不明白像LC这样的参数的概念,也没有找到INS来获取UID。 UID 第 1 部分是 0x93 ox20
,UID 第 2 部分是 0x95 0x20
吗?
最佳答案
命令 9x 20
是较低 ISO 14443-3 协议(protocol)的一部分,用于卡的防冲突和激活。另一方面,APDU 在更高的协议(protocol)层上进行交换,并且仅在 卡激活后进行。因此,您不能在 APDU 中使用这些命令代码。
如何从 DESFire (EV1) 卡获取 UID 取决于您实际想要获取的 ID 类型:
获取在防冲突阶段实际使用的 UID:这取决于您使用的阅读器(可能还有设备平台)。例如,PC/SC 兼容的非接触式智能卡读卡器通常允许使用 PC/SC 特定的 APDU 读取当前所选卡的防冲突标识符
FF CA 00 00 xx
(其中
xx
是00
或 UID 的预期长度,对于 DESFire 通常是04
或07
).(仅限 DESFire EV1)如果卡的随机 UID 功能未激活,则获取卡的 UID:您需要使用 GetVersion command .您需要使用 CLA 字节 0x90 来指示包装的 native 命令,将 INS 设置为命令代码 0x60,Lc 和 DATA 将不存在:
90 60 00 00 00
答案看起来像
<7 response data bytes> 91 AF
其中状态码
91 AF
表示命令码设置为0xAF可以获取更多数据。所以你必须发送另一个命令:90 AF 00 00 00
答案会(再次)看起来像
<7 response data bytes> 91 AF
所以你必须发送另一个 0xAF 命令。然后你会得到以下形式的答案:
<14 response data bytes> 91 00
其中响应数据的最后 7 个字节包含 UID。参见 parseGetVersion()关于如何解析接收到的数据。
(仅限 DESFire EV1)如果卡的随机 UID 功能已激活,则获取卡的 UID:这要复杂得多。您首先需要对卡进行身份验证。只有这样你才能使用 GetCardUID command检索实际的卡 UID。这个命令看起来像
90 51 00 00 00
答案看起来像
<UID (encrypted)> 91 00
关于uniqueidentifier - 用于从 MIFARE DESFire 获取 UID 的 APDU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819356/