我可以毫无问题地从智能卡发送大部分数据。我注意到出于某种原因,我总是需要删除 APDU 中的前 6 个字节才能获取真实数据。
但是,在发送一个特定数据时,很难知道数据在 APDU 中的位置。
这是 Java 智能卡模拟器的代码:
data = new byte[] {(byte)0x6302};
apdu.setOutgoing();
apdu.setOutgoingLength((short) data.length);
apdu.sendBytesLong(data, (short) 0, (short) data.length);
预期发送/接收的数据为:
{0x2}
但是,中间件响应 APDU 中接收的数据为:
responseApdu.getData():
{0x80, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1,0x5c, 0x6, 0xf9, 0x63, 0x33, 0x1, 0x2, 0x90, 0x0}
我还尝试记录由java卡模拟器发送的APDU;它是以下数据:
SendAPDU() data (apdu.getBuffer()):
{0x2, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0,0x1, 0x5c, 0x6, 0xf9, 0x63, 0x33, 0x0, .....(在此之后的所有0x0)}
偏移数据:5
有人可以帮助我理解为什么发送(或在发送之前读取)的数据与发送的实际数据如此不同吗?是某种填充吗?如何发送原始数据?
将代码更改为:
data = new byte[] {(byte) 0x63, (byte) 0x02};
apdu.setOutgoing();
apdu.setOutgoingLength((short) data.length);
apdu.sendBytesLong(data, (short) 0, (short) data.length);
数据字节 { 0x63, 0x02 } 将被发送出去。
以及您在问题中提到的数据:
- 响应 APDU 数据为:
responseApdu.getData(): {0x80, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x5c, 0x6, 0xf9, 0x63, 0x33, 0x1, 0x2, 0x90, 0x0}
表示命令数据为:{ 0x80, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x5c, 0x6, 0xf9, 0x63, 0x33, 0x1};
,响应数据为:{ 0x2, 0x90, 0x0 }
;
- apdu 缓冲区为:
SendAPDU() data (apdu.getBuffer()): {0x2, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x5c, 0x6, 0xf9, 0x63, 0x33, 0x0, ..... (all 0x0 after this point)} Offset CDATA: 5
表示将发送的数据字节0x02(发送长度为 1 字节),SW 0x9000({ 0x90, 0x00 })将在此字节之后发送。传出时不使用偏移 CDATA。而 APDU 缓冲区中的其他数据字节是你的 APDU 命令,第一个字节被传出字节覆盖(这里只有 1 个字节,0x02)。
注: APDU.sendBytesLong(data, offset, length)的进程:
1). 将带有偏移量和长度的数据复制到APDU缓冲区;
2). 使用 APDU 缓冲区发送数据;
3). 发送软件;