从java智能卡APDU接收到奇怪的数据?

从java智能卡APDU接收到奇怪的数据?,java,smartcard,javacard,apdu,Java,Smartcard,Javacard,Apdu,我可以毫无问题地从智能卡发送大部分数据。我注意到,出于某种原因,我总是需要删除APDU中的前6个字节来获取真实数据 但是,当发送一个特定数据时,很难知道数据在APDU中的位置 这是Java智能卡模拟器的代码: data = new byte[] {(byte)0x6302}; apdu.setOutgoing(); apdu.setOutgoingLength((short) data.length); apdu.sendBytesLong(data, (short) 0, (short) d

我可以毫无问题地从智能卡发送大部分数据。我注意到,出于某种原因,我总是需要删除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中接收的数据是:

responseADU.getData():

{0x80、0x32、0x0、0x0、0x8、0x0、0x0、0x1、0x5c、0x6、0xf9、0x63、0x33、0x1、0x2、0x90、0x0}

我还尝试记录java卡模拟器发送的APDU;这是以下数据:

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

{0x2,0x32,0x0,0x0,0x8,0x0,0x0,0x1,0x5c,0x6,0xf9,0x63,0x33,0x0,…(此点之后的所有0x0)}

抵消CDATA: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数据的响应为:
  • 表示命令数据为:
    {0x80、0x32、0x0、0x0、0x8、0x0、0x0、0x1、0x5c、0x6、0xf9、0x63、0x33、0x1},响应数据为:
    {0x2,0x90,0x0}

  • apdu缓冲区是:
  • 表示将发送数据字节0x02(发送长度为1字节),SW 0x9000({0x90,0x00})将在该字节之后发送。传出时不使用偏移量CDATA。APDU缓冲区中的其他数据字节是您的APDU命令,第一个字节被传出字节覆盖(这里只有1个字节,0x02)

    注意: APDU.sendBytesLong的处理(数据、偏移、长度):

    1) 。将具有偏移量和长度的数据复制到APDU缓冲区

    2) 。使用APDU缓冲区发送数据


    3) 。发送软件

    您的语句
    data=newbyte[]{(byte)0x6302}创建只有一个字节元素0x02的字节数组。这真的是你想要的吗?@nandsito是的,这是一条让中间件知道将特定数据发送回java卡的小消息。但是,我无法从中间件检索0x02(请参见输出)。您的命令的第一个字节(CLA字节)设置为0x02。这意味着您使用逻辑通道3。这是不可能工作的,我想知道为什么第一个字节有这样一个值。响应看起来像是一个经过修改的命令APDU,后面跟着响应,包括长度和状态字;我看不出有什么直接的解释。但是,将CLA字节设置为0x00或0x80可能值得一试。
    
    responseApdu.getData():
    {0x80, 0x32, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x5c, 0x6, 0xf9, 0x63, 0x33, 0x1, 0x2, 0x90, 0x0}
    
    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