javax.smartcardio案例4 APDU消失-6700响应-警告
使用javax.smartcardio类进行智能卡编程时,我遇到了一个持续的错误——当代码看起来很好时,从卡中返回6700(无效长度)和类似的错误代码。示例代码:javax.smartcardio案例4 APDU消失-6700响应-警告,java,smartcard,apdu,Java,Smartcard,Apdu,使用javax.smartcardio类进行智能卡编程时,我遇到了一个持续的错误——当代码看起来很好时,从卡中返回6700(无效长度)和类似的错误代码。示例代码: req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00); 这是为了构造一个案例4 APDU。为什么卡片的反应好像我遗漏了什么 这是为了构造一个案例4 APDU。为什么卡片的反应好像我遗漏了什么 简短回答 使用aid,0x100代替aid,0x00 详细回答(最好喝点咖
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
这是为了构造一个案例4 APDU。为什么卡片的反应好像我遗漏了什么
这是为了构造一个案例4 APDU。为什么卡片的反应好像我遗漏了什么
简短回答
使用aid,0x100
代替aid,0x00
详细回答(最好喝点咖啡):
这是因为Ne
和Le
之间存在混淆Ne
是可以返回到终端的最大字节数Ne
是一个没有特定表示的数字Le
然而是Ne
的编码或字节表示
现在对于ISO/IEC 7816-4有一个小技巧:Le
在没有响应数据(RDATA)的ISO案例1或3命令中不存在(没有字节)。因此,将Le=00定义为“无响应数据”是错误的。7816-4使用Le=00
表示Ne=256
。类似地,Le=0000
(或Le=000000
)表示Ne=65536
,即2^16。双字节和三字节编码仅用于扩展长度APDU
正如您在中所看到的,但是您必须指定Ne
,而不是Le
。因此,您指定的内容与表示没有响应数据相同。因此,APDU将不能正确解释为ISO案例4,并且命令将失败(正确地说,在这种情况下,6700
正是您应该期望的)
所以只需指定您期望的字节数。如果该值大于256,则需要扩展长度APDU(或命令链接,但这本身就是一个主题)Ne<0
或Ne>64Ki
当然不受支持
请注意,许多协议描述(包括Java卡API)在
Ne
和Le
之间的区别是错误的(顺便说一下,这一点已经得到了修复)。这有点奇怪,因为7816-4有很多问题,但这不是其中之一。它的指定非常清楚。卡响应有哪些类似的错误代码?您能说得更具体些吗?aid
数组中有什么?你能多发一点你的代码吗?@vojta:除了你知道卡片外,你能从AID数组的内容中分辨出什么细节?AID太短,AID太长,数组中的数据因为一个错误而不正确。。。我不知道…@vojta:类似的错误代码:“0x6c00错误长度”
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);