ISO 14443 A型卡使用Android读/写

时间:2014-03-25 22:47:14

标签: android nfc smartcard apdu contactless-smartcard

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

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

在stackoverflow中,APDU(例如this)有几个问题和答案,我试过没有运气。

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

我也在努力解决使用该卡的问题。到目前为止,我已经明白了:

  1. 我需要选择一个文件和
  2. 然后从文件中读取或写入文件。
  3. 该卡是新的,可能没有除文件控制信息之外的任何其他文件或信息。那么哪个PDU可用于在特定位置创建文件,哪个PDU可用于从该文件中读取?

1 个答案:

答案 0 :(得分:8)

您正在使用的卡(SmartCafe双界面)是一个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)

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

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

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

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

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

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

  5. 现在有几种可能性:

    1. 该卡是针对特定目的进行预先安装的,但您没有钥匙可以访问卡片管理器。
      在这种情况下,您需要知道如何连接卡上的应用程序。理想情况下,应用程序文档会显示您需要选择的AID以及您可以发送的命令。

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

    3. 该卡为特定目的预编程,您 有钥匙可以访问卡片管理器。
      在这种情况下,您唯一的选择是创建自己的应用程序,如2。