android - ISO 14443 A 类卡读/写使用 Android

标签 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. 然后从文件中读取或写入文件。

该卡是新卡,除了文件控制信息外,可能没有任何其他文件或信息。那么哪个 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 命令与之交互。

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

  1. 根据应用程序的 AID(应用程序标识符)选择一个应用程序。根据 ISO 7816-4,AID 可以看作是一个 DF 名称,您可以为该特定 DF 名称发出 SELECT 命令。

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

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

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

现在有几种可能性:

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

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

  3. 卡片针对特定用途进行预编程,您拥有访问卡片管理器的 key 。
    在这种情况下,您唯一的选择就是像 2 中那样创建自己的应用程序。

关于android - ISO 14443 A 类卡读/写使用 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22647935/

相关文章:

android - 如何更改抽屉导航中所选项目的默认蓝色

android - 检测耳机是否插入 Android 设备。

android - 排除带 NFC 的非 NXP Android 手机(如 Nexus 4/10)

android - 即使包含 Ndef 数据,也不会为 ACTION_NDEF_DISCOVERED 操作发现 NFC 标签

c++ - 基于证书的登录

java - 数字签名智能卡密码错误反馈

android - 当用另一个 fragment 替换 fragment 时, fragment 转换有轻微的延迟,如何防止它?

android - WearableListenerService 仅在应用程序安装后启动 - 然后再也不会

java - 用 Java 确定非接触式智能卡的电源要求。

linux - 关于智能卡安装