我是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
吗?
答案 0 :(得分:6)
命令9x 20
是较低ISO 14443-3协议的一部分,用于防卡和激活卡片。另一方面,APDU在更高的协议层上交换,并且仅在激活卡之后交换。因此,您无法在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来表示包装的本机命令,将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