我正在对一些我知道符合ISO7816-4标准的未知智能卡进行一些测试。我收集的卡片都来自同一个操作员,所有这些卡片都可以互换。
我一直通过Java SmartCardIO库和ACR122U阅读器向卡片发送APDU命令,并通过ISODEP库使用Android手机。
在我的Android设备上,我发送了以下apdu,一切正常,
tag.transceive(new byte[] {(byte)0x80, (byte)0x30, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00 })
10张牌中的10张都可以找到。
在我的桌面上,我有以下代码:
answer = channel.transmit(new CommandAPDU( new byte[] { (byte)0x80, (byte)0x30, (byte)0x03, (byte)0x00, (byte)0x00 } ));
这个代码适用于10个卡中的3个,其他7个我得到6700长度不正确的错误。对于剩下的7个,我必须使用这个代码,
answer = channel.transmit(new CommandAPDU( new byte[] { (byte)0x90, (byte)0x32, (byte)0x03, (byte)0x00, (byte)0x00,(byte)0x00, (byte)0x00 } ));
我也不能将此代码用于上述3张卡,我得到一个长度不正确的错误。
我无法弄清楚是什么问题,为什么要添加额外的2个空字节使其工作?我在Android设备上没有遇到这个问题,所有卡只能使用一个字符串。
答案 0 :(得分:2)
由于所有这些指令属于专有范围,我对意义和案例(DECREASE?)不太自信,但假设它们是案例4,允许命令数据和响应。
所有APDU明显格式错误。如果没有命令数据,则不能指定LC = 0 。零也不能是LE,因为在没有LC的情况下,它被编码为一个字节(短)或3个字节(扩展长度)。附加两个零字节的工作意味着,您将成功地切换到扩展长度,
我建议参考ISO 7816-4章节命令响应对。