2015-10-13 104 views
1

我在寫Java Applet。我需要使用APDU命令將預生成的RSAPrivateCrtKey上載到小程序。APDU命令中的負數

在我的電腦中,我正在生成密鑰。接下來我序列此鍵privateKeyBuffer

keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_512); 
keyPair.genKeyPair(); 
rsaPrivateKey = (RSAPrivateCrtKey) keyPair.getPrivate(); 

byte[] privateKeyBuffer = new byte[165]; 

short lengthDP1 = rsaPrivateKey.getDP1(privateKeyBuffer, 0); 
offset += lengthDP1; 

short lengthDQ1 = rsaPrivateKey.getDQ1(privateKeyBuffer, offset); 
offset += lengthDQ1; 

short lengthP = rsaPrivateKey.getP(privateKeyBuffer, offset); 
offset += lengthP; 

short lengthQ = rsaPrivateKey.getQ(privateKeyBuffer, offset); 
offset += lengthQ; 

short lengthPQ = rsaPrivateKey.getPQ(privateKeyBuffer, offset); 

產生緩衝,我應該每個數組元素轉換爲十六進制,然後用APDU發送和上次在小程序恢復我的私鑰後,但在privateKeyBuffer我們有負數:

37,65,-96,-110,38,6,-2,73,-37,28,120,-90... (etc) 

我應該如何將它們轉換爲十六進制並保持APDU正確(因爲我知道只有正數允許),或者可能有另一種方法將按鍵推送到JavaCard?

任何想法?

+0

你似乎提供Java卡代碼,而你是在告訴我們,「在我的電腦我生成的關鍵。」 **您在哪裏生成密鑰對,智能卡或電腦?**請根據情況更新您的問題和標題。 –

+0

在這個例子中,我在我的電腦中生成了密鑰,然後在apdu命令中發送密鑰到卡 – raiym

+0

因爲我的卡不支持RSA – raiym

回答

5

您可以簡單地將您的字節數組複製到APDU緩衝區併發送它。它會工作。

final byte[] apduBuffer = apdu.getBuffer(); 
Util.arrayCopyNonAtomic(privateKeyBuffer, (short) 0, apduBuffer, (short) 0, (short) privateKeyBuffer.length); 
apdu.setOutgoingAndSend((short) 0, (short) privateKeyBuffer.length); 

您不必考慮十六進制值和正數/負數!當你發送一個字節= 8位時,你根本不處理它的數字表示或含義。


一個額外注:

byte[] privateKeyBuffer = new byte[165];通常是一個壞主意。根本不需要這個緩衝區。您可以將鍵值直接複製到APDU緩衝區,保存一些持久性內存並使您的applet更快。


基於親愛的@亞伯拉罕的評論另注:

你可能面臨的Java Card正/負號唯一的問題是,Java卡byte簽署,很遺憾。這意味着它的值總是在範圍[-128,127],儘管人們往往忽視了它:

final byte b = getSomeByteValue(); //from APDU buffer, for example 
if (b == 0x80) { //always false! 
    //this never happens! 
} 

如果你想了解你的byte爲無符號(範圍爲[0,255]),你要投它到short這樣:

final byte b = getSomeByteValue(); //from APDU buffer, for example 
final short unsignedValue = (short) (b & 0xFF); 
if (unsignedValue == 0x80) { //correct! 
    //can happen 
} 
+2

我認爲最好提一下,他/她只有在想要將緩衝區與數字進行比較時才需要擔心負數/正數。例如,如果他想將'buffer [ISO7816.OFFSET_INS]'與'129'進行比較,他必須寫入'(buffer [ISO7816.OFFSET_INS]&0x00FF)== 129'而不是'buffer [ISO7816.OFFSET_INS] == 129 '。對? – Abraham

+1

@Abraham你是對的!我想提起它,但後來我懶得把它寫下來:-)。我會改進我的答案,謝謝。 – vojta

+0

'buffer [ISO7816。OFFSET_INS] == 129'不管怎麼說,你都應該創建一個字節常量'private static final byte INS_SOMETHING =(byte)0x81;'並將它與僅使用緩衝區[ISO7816.OFFSET_INS] == INS_SOMETHING的比較。 –