java - APDU 命令中的负数

标签 java encryption applet rsa javacard

我正在编写 Java Applet。我需要使用 APDU 命令将预生成的 RSAPrivateCrtKey 上传到小程序。

我在我的电脑上生成 key 。接下来我在 privateKeyBuffer 中序列化这个 key :

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 正确(因为据我所知只允许正数)或者可能有另一种方法将 key 推送到 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 缓冲区,节省一些持久内存并使您的小程序更快。


基于亲爱的@Abraham 评论的另一条注释:

不幸的是,在 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
}

关于java - APDU 命令中的负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33105237/

相关文章:

java - 用于 java 的 AES CS2Padding

javascript - 在哪里存储敏感数据?

java - 在 JApplet 上添加 JPanel 并编写 HTML 页面来运行它

java - 使用库编译 Java 小程序

Java 到 javascript 类型转换

java - 如何为多个平台导出 eclipse 4 应用程序

java - 搜索数据列表中的 View 回收 View Android

java - 无法解析符号 'ActivityCompat' 和 'content'

java - java中的条形码生成

c# - 从签名 key 的公钥生成 jwt 的 child