启用 NFC 的 SIM APDU 响应 6A 82

Posted

技术标签:

【中文标题】启用 NFC 的 SIM APDU 响应 6A 82【英文标题】:NFC Enabled SIM APDU Response 6A 82 【发布时间】:2014-11-11 05:55:08 【问题描述】:

我正在使用 ISO-7816-4 开发支持 NFC 的 SIM。当我尝试选择 MF、DF 或 EF 时,响应始终为 6A 82(未找到文件)。以下是 APDU

00 A4 00 00 02 3F 00 -> 选择 MF

00 A4 00 00 02 2F E2 -> 选择 EF

00 A4 00 00 02 7F 20 -> 选择 DF

响应总是相同的,即 6A 82。我在这里遗漏了什么吗?请帮忙。

【问题讨论】:

发送00 A4 00 00让卡选择返回什么会发生什么? 当我发送 00 A4 00 00 时,它以 6A 86(不正确的 P1-P2 参数)响应。有趣的是,当我发送 GET CHALLENGE 命令时,它会正确响应。我正在尝试使用 ACR122U213 NFC 读写器与它通信。 读卡器并不重要,因为它使用 ISO7816 和 ISO 14443 标准向卡发送命令。这意味着阅读器只是一种手段,并不是那么重要。至于新的错误..您在尝试读取卡之前是否发送了 RATS 命令? 不,我没有。你能分享一下RATS的APDU吗?供应商说 Mifare 扇区嵌入在这张 SIM 卡上,根据规格,它看起来像 1k。 @TheGoodUser-Amir 这个故事有点长。启用 NFC 的 SIM 的 SAK 值设置为 0x28,这意味着它同时支持 CPU APDU 和 ISO 14443-3 (Mifare 1k)。这就是阅读器无法与 SIM 中的 Mifare 1k 扇区通信的原因。一旦 SAK 值设置为 0x08,我的阅读器就开始与 Mifare 1k 扇区通信。 【参考方案1】:

您的 P2 不正确。但是,我不确定为什么卡返回状态 6A 82(找不到文件)而不是 6A 86(P1 到 P2 的参数不正确)。

要通过 FID(文件标识符)选择,您需要将 P2 设置如下:

    P2=04。如果选择成功,您将获得状态61XX。发送 GET RESPONSE,您将在响应数据中获得 FCP 模板。 P2=0C。如果 SELECT 成功,则不返回任何数据。仅状态9000

有关 P1 和 P2 的更多详细信息,请参阅 ETSI 102.221 第 11.1.1 节。您可以下载文件from this ETSI link。

【讨论】:

非常感谢您的回复,在这里我想补充一点,我和这张SIM卡的制造商谈过了。他告诉我我正在尝试与 SIM 的 CPU 进行通信,相反他告诉我此 SIM(1k 经典)上有一个 Mifare 扇区。但是当我发送 ISO-14443 的 APDU 时,阅读器什么也没发回。所以我再次联系制造商,现在他告诉我 SIM 的 SAK 设置为 0x28,这意味着它同时支持 CPU 和 Mifare,而我的阅读器目前忽略了 Mifare 扇区,因为 CPU 优先级很高。所以这种情况下如果SAK改成0x08就可以正常工作了。 有没有办法自己改变 SAK 的值?【参考方案2】:

问题不在于 APDU,而在于 SAK 的值。 SAK 值设置为 0x28。 这意味着支持 NFC 的 SIM 卡同时支持这两者;

    CPU 级 APDU(我试图与之通信的那个)和 Mifare 1k 扇区(我应该首先尝试与之通信的扇区)。

但是 CPU 级 APDU 的优先级高于 Mifare 扇区,因此我的 NFC 读写器无法与 Mifare 1k 扇区通信。一旦SAK 的值更改为0x08,它就会禁用 CPU 级别的 APDU,并且我的 NFC 读写器能够与 Mifare 1k 扇区通信。希望这会有所帮助。

【讨论】:

能否请您解释一下如何设置 SAK 值以及如何检查...我在过去 48 小时内一直在努力解决这个问题***.com/questions/51548209/… 它是由制造公司设置的,据我所知是硬编码的。 SAK 值对我来说也是 0x28。这意味着我将无法从 NFC 智能卡中读取任何二进制文件。 ???但这适用于我使用 javax.smartcardio 的 java 应用程序。

以上是关于启用 NFC 的 SIM APDU 响应 6A 82的主要内容,如果未能解决你的问题,请参考以下文章

SIM CARD APDU解析工具

APDU 命令更改 IMSI SIM 卡

使用 APDU 命令克隆 NFC 电子护照

SIM逻辑模型与APDU

SIM逻辑模型与APDU

无法使用 nfc_initiator_transceive_bytes() 使用 libnfc 发​​送大型 APDU 命令