我正在尝试编写一个 Android 应用程序来读/写支持 ISO 14443 A 类标准的 NFC 卡。经过彻底搜索后,现在留给我的唯一选择似乎是通过发送 APDU 命令来使用 IsoDep 类及其收发方法。我拥有的卡是支持 ISO 14443 和 ISO 7816 标准的 SmartCafe 双界面卡。
然后我说要寻找 14443 标准的 APDU。我找到了 this page对此有很好的资源。然而,问题是缺少任何示例 APDU。
stackoverflow 中有几个关于 APDU 的问题和答案(例如 this ),我试过但没有成功。
暴力尝试通过选择命令揭示了以下结果:6F108408A000000003000000A5049F6501FF9000这看起来像是卡的文件控制信息。但我正在为如何解释这些信息而苦苦挣扎。
我也在努力处理使用卡片的流程。到目前为止我已经理解:
- 我需要选择一个文件
- 然后从文件中读取或写入文件。
该卡是新卡,除了文件控制信息外,可能没有任何其他文件或信息。那么哪个 PDU 可用于在特定位置创建文件以及哪个 PDU 可用于从该文件读取?
最佳答案
您使用的卡(SmartCafe 双接口(interface))是 JavaCard。
您尝试的 SELECT 命令一定是这样的:
00 A4 04 00 00
或
00 A4 04 00 08 A000000003000000 00
您在响应该 SELECT 命令时看到的是 GlobalPlatform 卡管理器的 FCI:
6F 10 (FCI template) 84 08 (Application DF name) A000000003000000 A5 04 (Proprietary data) 9F65 01 (Maximum length of data field in command message) FF (256) 9000 (status=no error)
对于那种类型的卡,文件的概念在默认情况下并不真正存在(因此仅选择一个文件并对其进行读/写通常是行不通的)。相反,此卡包含基于 Java 的应用程序,您可以使用 APDU 命令与之交互。
因此与应用程序交互的典型流程是:
根据应用程序的 AID(应用程序标识符)选择一个应用程序。根据 ISO 7816-4,AID 可以看作是一个 DF 名称,您可以为该特定 DF 名称发出 SELECT 命令。
将任意 APDU(根据 ISO 7816-4,具有跨行业或专有编码)发送到选定的应用程序。
基于 Java(实际上是基于 JavaCard,其中 JavaCard 是 Java 语言的扩展子集)的应用程序接收命令,对其进行解码和处理并生成响应。
卡片将应用程序的响应发送回读卡器。
现在有几种可能性:
该卡已针对特定用途进行了预编程,您没有访问卡管理器的 key 。
在这种情况下,您需要知道如何连接卡上的应用程序。理想情况下,应用程序文档会告诉您需要选择什么 AID 以及可以发送什么命令。卡片已针对特定用途进行了预编程,但您确实拥有访问卡片管理器的 key ——而且,当然,您不想使用预编程已编程的应用程序,但想使用您自己的应用程序(否则与 1. 适用相同)。
在这种情况下,您可以创建自己的 JavaCard 应用程序(或使用一些适合您目的的现成应用程序)并将其安装到卡上(例如使用像 GPShell 这样的开放工具)。然后您就可以使用您自己定义的接口(interface)访问该卡。卡片未针对特定用途进行预编程,您拥有访问卡片管理器的 key 。
在这种情况下,您唯一的选择就是像 2 中那样创建自己的应用程序。
关于android - ISO 14443 A 类卡读/写使用 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22647935/