如何在 Android 中读取智能卡 ATR?

Posted

技术标签:

【中文标题】如何在 Android 中读取智能卡 ATR?【英文标题】:How to read smartcard ATR in Android? 【发布时间】:2017-07-20 07:13:17 【问题描述】:

我有一个 1443 B 型卡,我可以通过发送 SELECT 命令读取 ATR,文件 ID 为 0x2F01,然后发送 READBINARY 命令

00 B0 00 00 00 这是回复:4301F84703F741E07F6608020205F0020205F09000

但是为什么00 B0 81 00 00 命令不起作用呢?根据 ISO/IEC 7816-4,该命令用于读取 EF 的 5 位 P1xP2 作为文件短 ID (00001),Le = 0x00 指定需要读取文件的所有字节。 我错过了什么吗?如何读取短 ID 的文件?

关于返回的 ATR,在 SC17_N5781_ISO_IEC_FDIS_7816-62_Identification 中定义。它表明:

标签 43 --> 卡服务数据 长度 01 --> 1 字节 值 F8 --> 参见 ISO/IEC 7816-4 12.1.1.5

标签 47 --> 卡片功能 长度 03 --> 3 个字节 值 F7 41 E0 --> 参见 ISO/IEC 7816-4 12.1.1.9

标签 7F66 --> 扩展长度 APDU 长度 08 --> 8 个字节 值 --> 参见 ISO/IEC 7816-4 12.7.1 标签 02 长度 02 值 05 F0 标签 02 长度 02 值 05 F0 但我找不到上面提到的 7816-4 第 12 节。因此,尽管我现在可以成功读取 ATR,但我无法阐明返回的 ATR 中值的定义。这个标准有发布吗?

【问题讨论】:

【参考方案1】:

如果您有 ISO/IEC 14443 A 类型卡,那么 ATS 将包含大部分信息,否则这些信息将存储在 ATR 中。在这种情况下,不太可能为卡定义 EF.ATR - 该文件的可用性不是强制性的。

由于缺少 ATS,因此 ISO/IEC 14443 B 型卡更可能存在 EF.ATR。

如果存在 EF.ATR,则可以使用 SELECT by File ID (2F01) 来选择它。当您尝试使用问题中的 READ BINARY 命令时,此文件可能具有短文件标识符 0_0001(5 位二进制),但建议您尝试使用完整的文件 ID 以确定。然后,如果无法读取文件,您只需使用 READ BINARY 或 GET DATA 读取文件。

【讨论】:

我已经编辑了我的问题。你能看到吗@Maarten Bodewes @Maarten 你能帮我解决这个问题吗***.com/questions/51558845/…【参考方案2】:

与此同时,android 9 提供了SEService。在Reader 上获得具有getUiccReader 的读者后,可以打开一个会话。 Session 有一个方法 getATR

【讨论】:

以上是关于如何在 Android 中读取智能卡 ATR?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中从智能卡中读取名称和地址等基本数据?

Web 表单中的智能卡授权

在智能卡上上传 .cap 文件?

深入理解7816---关于ATR

从文件系统的目录中删除后如何重新创建 ATR 文件?

javax.smartcardio 读取所有智能卡