APDU从MIFARE DESFire获取UID?

时间:2015-04-23 09:32:54

标签: uniqueidentifier mifare apdu smartcard-reader contactless-smartcard

我是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吗?

1 个答案:

答案 0 :(得分:6)

命令9x 20是较低ISO 14443-3协议的一部分,用于防卡和激活卡片。另一方面,APDU在更高的协议层上交换,并且仅在激活卡之后交换。因此,您无法在APDU中使用这些命令代码。

如何从DESFire(EV1)卡获取UID取决于您实际想要获得的ID类型:

  • 获取在防冲突阶段实际使用的UID :这取决于您使用的读卡器(可能还有设备平台)。例如,符合PC / SC标准的非接触式智能卡读卡器通常允许使用PC / SC特定APDU读取当前所选卡的防冲突标识符

    FF CA 00 00 xx
    

    (其中xx00或UID的预期长度,因为DESFire通常为0407

  • (仅限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