javax.smartcardio 案例 4 APDU 消失 - 6700 响应 - 警告

标签 java smartcard apdu

使用 javax.smartcardio 类进行智能卡编程时,我遇到了一个持续错误 - 当代码看起来正常时,从卡中返回 6700(无效长度)和类似的错误代码。示例代码:

    req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);

这应该构造一个 case 4 APDU。为什么卡的 react 就像我遗漏了什么一样?

最佳答案

   req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);

This is supposed to construct a case 4 APDU. Why does the card respond as if I were missing something?

简短回答

使用aid, 0x100而不是aid, 0x00 .

长答案(最好喝点咖啡):

这是因为 Ne 之间的混淆和LeNe是可以返回到终端的最大字节数。 Ne是一个没有具体表示的数字。 Le然而 Ne编码以字节为单位的表示 .

现在对于 ISO/IEC 7816-4 有一个小技巧:Le如果 ISO 情况 1 或 3 命令没有响应数据 (RDATA),则不存在(无字节)。所以定义Le = 00表示“无响应数据”是虚假的。相反,7816-4 使用 Le = 00意思是Ne = 256 。同样,Le = 0000 (或 Le = 000000 )意味着 Ne = 65536 ,即 2^16。双字节和三字节编码仅用于扩展长度的 APDU。

正如您在 CommandAPDU constructor 中看到的那样但是你必须指定 Ne ,不是Le 。因此,您指定的内容与表示没有响应数据相同。因此,APDU 将不会被正确解释为 ISO 情况 4,并且命令将失败(在本例中,6700 正是您所期望的)。

因此只需指定您期望的字节数即可。如果该值大于 256,则需要扩展长度的 APDU(或命令链,但这本身就是一个主题)。 Ne < 0Ne > 64Ki当然不支持。

<小时/>

请注意,许多协议(protocol)描述包括 Java Card API 都区分了 NeLe错误(顺便说一句,这已在 the Java Card API v3.0.5 中修复)。这有点奇怪,因为 7816-4 有很多很多问题,但这不是其中之一。已经说的很清楚了。

关于javax.smartcardio 案例 4 APDU 消失 - 6700 响应 - 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31052297/

相关文章:

java - Cometd 发布输入数据 Map 而不是等待服务器的输出

java - 获取字符串的特定子串

java - 如何在 Android 上的 Java 应用程序中运行 Lua 脚本?

java - 使用 javax.smartcardio 读取 NFC Mifare Ultralight 卡

java - 是否可以在卡不存在时发送伪 APDU 命令?

java - NetBeans 模拟器中的扩展 APDU 未被解析

java - 使用空布局将 JPanel 添加到 JApplet

smartcard - 获取智能卡 uid 的 APDU 命令

payment - 获取处理选项的问题

java - 智能卡 ATR 和选择文件命令