2015-10-13 59 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的比较。 –