APDU从MIFARE DESFire获取UID?

soh*_* ab 1 uniqueidentifier apdu smartcard-reader mifare 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
Run Code Online (Sandbox Code Playgroud)

我想获得DESFire UID,但我无法为此创建命令APDU.任何人都能引导我走向正确的方向吗?我创建了这个APDU,但我不确定它是否正确:

byte[8] cmd_apdu_getUID_part1= {0x90 , 0x93 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00};
Run Code Online (Sandbox Code Playgroud)

我不明白像LC这样的参数的概念,我找不到用于获取UID的INS.它0x93 ox20适用于UID的第1部分和UID 0x95 0x20的第2部分吗?

Mic*_*and 7

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

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

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

    FF CA 00 00 xx
    
    Run Code Online (Sandbox Code Playgroud)

    (其中xx00UID的任一或预期长度,通常为DESFire 0407).

  • (仅限DESFire EV1)如果未激活卡的随机UID功能,则获取卡的UID:您需要使用GetVersion命令(请参阅DESFire EV1数据表).您需要将INS设置为您在数据表(cmd)中找到的命令代码,Lc和DATA将不存在:

    90 60 00 00 00
    
    Run Code Online (Sandbox Code Playgroud)

    答案看起来像

    <7 response data bytes> 91 AF
    
    Run Code Online (Sandbox Code Playgroud)
  • (仅限DESFire EV1)如果卡的随机UID功能被激活,则获取卡的UID:这要复杂得多.您首先需要对卡进行身份验证.只有这样,您才能使用GetCardUID命令(请参阅DESFire EV1数据表)来检索实际的卡UID.同样,这个命令看起来像

    90 AF 00 00 00
    
    Run Code Online (Sandbox Code Playgroud)

    答案看起来像

    <7 response data bytes> 91 AF
    
    Run Code Online (Sandbox Code Playgroud)