簡體   English   中英

APDU命令中的負數

[英]Negative numbers in APDU command

我在寫Java Applet。 我需要使用APDU命令將預先生成的RSAPrivateCrtKey上傳到applet。

在我的計算機上,我正在生成密鑰。 接下來,我在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發送,最后在applet中恢復我的私鑰,但是在privateKeyBuffer我們有負數:

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

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

有任何想法嗎?

您可以簡單地將字節數組復制到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 Card 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM