2017-05-14 138 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;