从 MIFARE DESFire 获取 UID 的 APDU?
Posted
技术标签:
【中文标题】从 MIFARE DESFire 获取 UID 的 APDU?【英文标题】:APDU for getting UID from MIFARE DESFire? 【发布时间】:2015-04-23 09:32:54 【问题描述】:我是 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
?
【问题讨论】:
【参考方案1】: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
【讨论】:
如何发现随机UID功能未激活或未激活?这个功能是干什么用的?而且您必须知道我没有更改我的 DESFire 卡,并且我在未做的和本机卡上工作,没有任何更改。另一个问题:防碰撞阶段是什么意思?你能详细解释一下吗? 你不告诉我什么是LC和数据?包装的 Data 和 DESFire 命令参数是什么意思? 我理解防碰撞的含义:智能防碰撞机制允许现场同时处理多个MIFARE DESFire EV1。防冲突算法单独选择每个 MIFARE DESFire EV1,并确保使用选定的 MIFARE DESFire EV1 正确执行事务,而不会因现场其他 MIFARE DESFire EV1 导致数据损坏。 ------------------------ 现在我想知道如何激活随机 UID 功能?我也找不到 GetCardUID 命令(我看到了 DESFire 数据表)。这是什么? @soheylaab 为什么您没有将这个综合答案作为正确答案进行检查?!我想你总是忘记检查答案! 亲爱的 Micheal,请问您告诉我为什么我们需要知道 UID?我的意思是,在什么样的情况下,拥有 UID 是有用的?以上是关于从 MIFARE DESFire 获取 UID 的 APDU?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Nexus 5获取Mifare Ultralight 16位UID读数