[英]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.