ISO 14443 A 型卡使用 Android 读/写

Posted

技术标签:

【中文标题】ISO 14443 A 型卡使用 Android 读/写【英文标题】:ISO 14443 Type A Card Read/Write using Android 【发布时间】:2014-03-25 22:47:14 【问题描述】:

我正在尝试编写一个 android 应用程序来读取/写入支持 ISO 14443 Type A 标准的 NFC 卡。经过彻底的搜索,我现在唯一的选择似乎是通过发送 APDU 命令来使用 IsoDep 类及其收发方法。我的卡是支持 ISO 14443 和 ISO 7816 标准的 SmartCafe 双接口卡。

然后我说要寻找符合 14443 标准的 APDU。我发现this page 有一个很好的资源。但是,问题是缺少任何示例 APDU。

*** 中有几个关于 APDU(例如 this)的问题和答案,但我没有成功。

蛮力尝试使用选择命令显示以下结果: 6F108408A000000003000000A5049F6501FF9000 这看起来像是卡的文件控制信息。但我正在为如何解释这些信息而苦苦挣扎。

我也在努力处理使用卡片的流程。到目前为止我已经明白了:

    我需要选择一个文件,然后 然后从文件中读取或写入文件。

卡是新卡,除了文件控制信息外,可能没有任何其他文件或信息。那么哪个 PDU 可以用于在特定位置创建文件,哪个 PDU 可以用于从该文件中读取呢?

【问题讨论】:

【参考方案1】:

您使用的卡(SmartCafe 双接口)是 JavaCard。

您尝试的 SELECT 命令一定是这样的:

00 A4 04 00 00

00 A4 04 00 08 A000000003000000 00

您在响应该 SELECT 命令时看到的是 GlobalPlatform 卡管理器的 FCI:

6F 10 (FCI 模板) 84 08 (应用程序 DF 名称) A000000003000000 A5 04 (专有数据) 9F65 01 (命令消息中数据字段的最大长度) FF (256) 9000 (状态=无错误)

对于这种类型的卡,文件的概念在默认情况下并不存在(因此仅选择一个文件并对其进行读/写通常不会起作用)。相反,此卡包含基于 Java 的应用程序,您可以使用 APDU 命令与之交互。

因此,与应用程序交互的典型流程是:

    根据 AID(应用程序标识符)选择应用程序。根据 ISO 7816-4,AID 可以被视为 DF 名称,您可以针对该特定 DF 名称发出 SELECT 命令。

    向选定的应用程序发送任意 APDU(根据 ISO 7816-4,具有跨行业或专有编码)。

    基于 Java(实际上是基于 JavaCard,其中 JavaCard 是 Java 语言的扩展子集)的应用程序接收命令,对其进行解码和处理并生成响应。

    卡将应用程序的响应发送回读卡器。

现在有几种可能:

    该卡已针对特定目的进行了预编程,您没有访问卡管理器的密钥。 在这种情况下,您需要知道如何连接卡上的应用程序。理想情况下,应用程序文档会告诉您需要选择什么 AID 以及可以发送什么命令。

    卡已针对特定目的进行了预编程,但您确实拥有访问卡管理器的密钥 - 当然,您不想使用预已编程的应用程序,但想使用您自己的应用程序(否则与 1. 中的应用程序相同)。 在这种情况下,您可以创建自己的 JavaCard 应用程序(或使用一些适合您目的的现成应用程序)并将其安装到卡上(例如,使用像 GPShell 这样的开放工具)。然后就可以使用自己定义的接口访问卡了。

    没有针对特定目的进行预编程,您确实拥有访问卡管理器的密钥。 在这种情况下,您唯一的选择就是创建自己的应用程序,如 2 所示。

【讨论】:

太好了,这正是我需要知道的。在线提供的教程都没有您对 FCI 的回答那么具体。而且,GPSShell 会派上用场。非常感谢。 很好的答案,对初学者很有帮助!谢谢老哥!

以上是关于ISO 14443 A 型卡使用 Android 读/写的主要内容,如果未能解决你的问题,请参考以下文章

问题读取智能卡

ISO-IEC 14443 Type A&B summary

68 iso14443读卡入门记录

NFC 标签 ISO 14443-3A 类型的读取标签命令是啥

ISO14443 - React Native NFC 有时“标签连接丢失” - 仅在 iOS 上

讲解:NFC之PN532使用