我是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这样的参数的概念,我找不到用于获取UID的INS。对于UID的第1部分是0x93 ox20
,对于UID的第2部分是0x95 0x20
吗?
命令9x 20
是较低的ISO 14443-3协议的一部分,并在卡的防冲突和激活期间使用。另一方面,APDU在更高的协议层上交换,并且仅在激活卡之后。因此,您不能在APDU中使用这些命令代码。
如何从DESFire(EV1)卡获取UID取决于您实际想要获得的ID类型:
FF CA 00 00 xx
(其中xx
是00
或UID的预期长度,因为DESFire通常是04
或07
)。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()。90 51 00 00 00
答案看起来像
<UID (encrypted)> 91 00