如何在 DESfire Ev1 卡上使用 ISO7816 选择命令?

Posted

技术标签:

【中文标题】如何在 DESfire Ev1 卡上使用 ISO7816 选择命令?【英文标题】:How to use ISO7816 select command with DESfire Ev1 card? 【发布时间】:2014-12-17 21:42:24 【问题描述】:

我有一个 DESfire Ev1 1.3 版卡,我正在尝试使用 ISO7816 apdu 样式选择一个文件。

我有一个文件,在 A0 A1 A2 的帮助下,我可以使用本机或包装模式选择它:

本地人:

-> 5A A0 A1 A2
<- 00

包装:

-> 90 5A 00 00 03 A0 A1 A2 00
<- 91 00

但是,如果我尝试使用 ISO7816 样式选择它,我总是会收到文件未找到错误:

ISO7816:

-> 00 A4 04 00 03 A0 A1 A2 00
-> 6A 82

当使用 ISO apdu 时,AID 的格式是否不同?如何使用它来选择此 AID?

【问题讨论】:

欢迎来到 Stack Overflow!第一个问题很好;您简洁地描述了您的问题,添加了预期结果,提供了实际结果,并将范围缩小到仅重现问题的信息。 啊,谢谢 :) 我认为这是潜伏多年的影响 :) 【参考方案1】:

来自文档:

此 APDU 通过它的 ISO 应用程序选择一个 ISO 应用程序 标识符 (AID)。 DESFire 的 ISO AID 是“0xD2 76 00 00 85 01 00”。 必须传输完整的 ISO AID,部分选择不是 支持的。 DESFire 不支持其他 ISO AID

这似乎与您拥有 AID 0xA0 0xA1 0xA2 的事实相矛盾。

看来你需要发送:

[CLA] [INS] [P1] [P2] [Len(AID)] [AID] 

因此:

0x00 0xA4 0x04 0x00 0x07 0xD2 0x76 0x00 0x00 0x85 0x01 0x00

** 编辑 **

改用ISO SELECT DIRECTORY

这个 APDU 通过它的三字节 DESFire 选择一个 DESFire 应用程序 应用程序标识符 (DESFire AID)。 ...

ISO SELECT DIRECTORY 命令的功能是兼容的 使用原生 DESFire“选择应用程序”命令。

所以:

0x00 0xA4 0x04 0x00 0x03 0xA0 0xA1 0xA2

(这是在下一页上,可能是您最初想要的。)

我认为这与您所拥有的相同,只是减去了末尾的 NUL

【讨论】:

好吧,现在我很困惑。我使用了0xA0 A1 A2,因为在 DESfire 中,文件必须具有三个字节长的 ID。所以CA A0 A1 A2 0F 01 创建了这个应用程序,我可以使用5A A0 A1 A2 进行选择。这个AID是指卡本身,那么呢? (它会自动选择主文件?) 这对我来说也很矛盾;该手册实际上说您必须对该 ID 进行硬编码(产品规范的第 72 页),并且该 ID 为 7 个字节。就好像您无法在 ISO 7816 模式下选择单个文件一样。 如果我不能选择单个文件,是否仍然可以在主文件中写入数据?我现在没有我的读者,但我会看看当我有它时我能做什么(明天)。 看看我的编辑;我认为您只需要在尝试结束时摆脱NUL 所以,如果我使用00 a4 04 00 07 d2 76 00 00 85 01 00,它可以工作(回复90 00),但如果我使用00 a4 04 00 03 a0 a1 a2,它就不行。现在我必须弄清楚如何正确使用它。

以上是关于如何在 DESfire Ev1 卡上使用 ISO7816 选择命令?的主要内容,如果未能解决你的问题,请参考以下文章

使用 javax.smartcardio 时 DESfire EV1 为 PPS 命令包装 APDU 的问题

javax.smartcardio:如何将本机命令发送到 Desfire 卡?

Mifare DESFire 读取文件

使用 ISO 7816-4 APDU 的 DESFire 卡中的外部身份验证

S50 ev1 设置随机UID

从 MIFARE DESFire 获取 UID 的 APDU?