2017-05-14 48 views
1

我可以从智能卡发送大部分数据,没有问题。我注意到我总是需要删除APDU中的前6个字节以获得真实数据。从java智能卡APDU接收到奇怪的数据?

但是,当发送一个特定的数据时,很难知道数据在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,0×90,为0x0}

我也尝试记录由Java卡模拟器发送的APDU;它是如下的数据:

SendAPDU()数据(apdu.getBuffer()):

{0X2,0x32,为0x0,为0x0,0x8中,为0x0,为0x0,0x1,则0x5c,为0x6,0xf9 ,0x63,0x33,为0x0,......(这一点毕竟为0x0)}

偏移CDATA:5

有人可以帮我理解为什么派(或读取,甚至在发送之前)的数据与实际发送的数据是如此不同?它是一种填充吗?我如何获得原始数据?

+3

您的语句'data = new byte [] {(byte)0x6302};'创建一个只有一个字节元素0x02的字节数组。它真的是你想要的吗? – nandsito

+0

@nandsito这是一个让中间件知道将特定数据发送回java卡的小消息。但是,我无法从中间件检索0x02(请参阅输出)。 –

+2

您的命令的第一个字节(CLA字节)设置为0x02。这意味着你使用逻辑通道3.这不是可能的工作,我想知道为什么第一个字节有这样的价值。响应看起来像一个改变后的命令APDU,后面是响应,包括长度和状态字;我没有看到对此的直接解释。然而,将CLA字节设置为0x00或0x80可能值得尝试。 –

回答

1

更改代码:

data = new byte[] {(byte) 0x63, (byte) 0x02}; 
apdu.setOutgoing(); 
apdu.setOutgoingLength((short) data.length); 
apdu.sendBytesLong(data, (short) 0, (short) data.length); 

数据字节{0x63,0×02}将被发送出去。

而你在你的问题中提到的数据:

  1. 响应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的 处理(数据,偏移,长度):

    1)。将具有偏移和长度的数据复制到APDU缓冲区; 2)。使用APDU缓冲区发送数据; 3)。发送SW;