4

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

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

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

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

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

  1. 我需要选择一个文件并
  2. 然后从文件中读取或写入文件。

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

4

1 回答 1

9

您使用的卡(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 命令与之交互。

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

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

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

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

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

现在有几种可能:

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

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

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

于 2014-03-27T07:06:07.030 回答