【问题标题】:Send more than 261 bytes to Java Card with Android NFC使用 Android NFC 向 Java Card 发送超过 261 个字节
【发布时间】:2026-01-26 15:50:01
【问题描述】:

我想通过 NFC(IsoDep 类)向 Java Card 智能卡发送一个长度为 1699 字节的 APDU。我得到了错误

java.io.IOException:收发长度超过支持的最大值

我的手机是三星 Galaxy S7。

我在卡上的小程序中使用扩展长度。我已验证该卡支持扩展长度。我通过 pyapdutool 向卡发送了一个 4000 字节的 APDU 对此进行了测试。

发现我写这段代码的时候,结果是false:

final Tag t = (Tag) tag;
myTag = IsoDep.get(t);
boolean result = myTag.isExtendedLengthApduSupported();

我的清单中有这个:

<activity
        android:name=".test"
        android:label="@string/title_test"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" >
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    </intent-filter>
</activity>

如何通过 Android NFC 发送 1699 字节(或任何长度大于 261​​ 字节)的 APDU?

【问题讨论】:

  • 据我所知,该主题尚未解决
  • 不清楚卡是否支持这样的长度。您是否在台式电脑上尝试过并在那里工作过?
  • 即使是我的带有 NFC 芯片的笔记本电脑也不支持扩展长度。不幸的是,这又是同一个故事。第一个“普通”智能卡读卡器不支持扩展长度,然后他们以极其错误的方式支持,现在似乎只剩下小问题了。我认为 NFC 芯片也会采用同样的方式(尽管这些芯片更便宜,因此可能需要更多时间)。

标签: android nfc javacard apdu contactless-smartcard


【解决方案1】:

简答:你不能轻易做到这一点。

您已经发现 IsoDep 在您的设备上不“支持”扩展长度的 APDU(即 isoDep.isExtendedLengthApduSupported() 返回 false)。事实上,这意味着您不能通过IsoDep 对象发送扩展长度的APDU。它实际上仅意味着IsoDep 对象不会正确地将扩展长度的 APDU 拆分到两个以上的 ISO-DEP 块中,因此将假定长度超过 261 个字节的 APDU 超过传输缓冲区大小。您应该仍然能够发送大小

所以isoDep.isExtendedLengthApduSupported() 实际上表示您是否可以在一个 ISO-DEP 收发器中发送超过 261 个字节。

您可以做的就是完全不使用IsoDep 对象,而是在NfcA 对象之上手动实现ISO-DEP(ISO/IEC 14443-4 传输协议) (如果您的卡基于 NFC-A / ISO/IEC 14443 Type A)或NfcB 对象(如果您的卡基于 NFC-B / ISO/IEC 14443 Type B 并且如果您的设备支持通过NfcB 对象交换数据)。然后,您可以将扩展长度的 APDU 拆分为足够小的 ISO-DEP 块,以容纳 NFC 控制器的收发缓冲区(通常为 253 个字节,包括标头字节,不包括 CRC 字节)。但是,自己处理 ISO-DEP 协议也意味着您必须处理正确的 ISO-DEP 激活,处理块编号、块确认、超时、等待时间延长等。这相当复杂,尤其是超时是由于 Android NFC 堆栈的延迟,不易观察。

【讨论】:

  • 我想在我的卡里有密钥对和证书。是pki卡吗? pki卡有证书吗?你有更好的建议给我吗?
  • @Fatemeh 我不确定这与扩展长度的 APDU 支持有何关系。
  • 感谢您的完整回答,但我想使用 android 应用程序在 java 卡中创建证书。我在卡中创建密钥对并使用 nfc 颁发证书,现在我想将证书存储在卡中。你对我有更好的建议来代替isodep类吗?
  • @Fatemeh 您不需要扩展长度的 APDU 来将大量数据写入 Java Card 小程序。相反,您将实现您的写入(例如 WRITE/UPDATE BINARY 命令)以多个较小的块传输数据。
  • 谢谢迈克尔。我根据你的解释写了我的代码,但我又得到了错误。我把它贴在*.com/questions/40395275/…。你能帮帮我吗?
最近更新 更多