首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >APDU命令中的负数

APDU命令中的负数
EN

Stack Overflow用户
提问于 2015-10-13 14:24:46
回答 1查看 308关注 0票数 1

我正在编写Java Applet。我需要上传预生成的RSAPrivateCrtKey与APDU命令应用程序。

在我的电脑里,我正在生成密钥。接下来,我在privateKeyBuffer中序列化这个键:

代码语言:javascript
复制
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中我们有负数:

代码语言:javascript
复制
37,65,-96,-110,38,6,-2,73,-37,28,120,-90... (etc)

我应该如何将它们转换为十六进制并保持APDU正确(因为我知道只有正数允许),或者可能有其他方法将密钥推送到JavaCard?

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-13 15:59:24

您可以简单地将字节数组复制到APDU缓冲区并发送它。看起来不错。

代码语言:javascript
复制
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中唯一可能遇到的正负号问题是,Java byte签名的,很不幸。这意味着它的值总是在-128,127,尽管人们经常忘记它:

代码语言:javascript
复制
final byte b = getSomeByteValue(); //from APDU buffer, for example
if (b == 0x80) { //always false!
     //this never happens!
}

如果您想将您的byte理解为无符号(范围为0,255),则必须通过以下方式将其转换为short

代码语言:javascript
复制
final byte b = getSomeByteValue(); //from APDU buffer, for example
final short unsignedValue = (short) (b & 0xFF);
if (unsignedValue == 0x80) { //correct!
     //can happen
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33105237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档