java - 椭圆曲线 Diffie Hellman 如何结合 Java 在 JavaCard 上工作?

标签 java javacard elliptic-curve diffie-hellman

我正在尝试让椭圆曲线 Diffie Hellman 在 JavaCard(版本 2.2.1)上工作。

在 JavaCard 上,我现在有以下代码:

byte temp[] = new byte[100];
byte secret[] = new byte[100];
byte size = buf[ISO7816.OFFSET_LC];

Util.arrayCopy(buf, ISO7816.OFFSET_CDATA, temp, (byte) 0, size);

// the public key is in temp
short len = dh.generateSecret(temp, (byte) 0, size, secret, (byte) 0);

Util.arrayCopy(temp, (byte) 0, buf, ISO7816.OFFSET_CDATA, size);
//Util.arrayCopy(secret, (byte) 0, buf, ISO7816.OFFSET_CDATA, len);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, size);

然后我将 dh 初始化如下:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);
keyPair.genKeyPair();
dh = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
dh.init(keyPair.getPrivate());

所有这些似乎都有效,除了 dh.generateSecret 调用外,applet 似乎只是崩溃了。如果我离开调用并返回其他数据,那效果很好。我在其中导入终端发送的数据。在终端中,我有以下内容:

// generate an ecdh keypair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
keyGen.initialize(163);
KeyPair keyPair = keyGen.generateKeyPair();

// initialize DH
KeyAgreement dh = KeyAgreement.getInstance("ECDH");
dh.init(keyPair.getPrivate());

//byte encKey[] = keyPair.getPublic().getEncoded();

// X9.62 encoding, no compression
int qLength = (163+7)/8;
byte[] xArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineX().toByteArray();
byte[] yArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineY().toByteArray();
byte[] enc2 = new byte[1+2*qLength];
enc2[0] = (byte) 0x04;
System.arraycopy(xArr, 0, enc2, qLength - xArr.length, xArr.length);
System.arraycopy(yArr, 0, enc2, 2* qLength - yArr.length, yArr.length);

byte res[] =send((byte) 0x00, enc2).getData();

我试过很多东西。现在,发送公钥的代码尝试按照 JavaCard 文档指定的 X9.62 编码(未压缩)对其进行编码。但是,我也尝试了默认的 encode 方法,它给出了完全相同的结果。

我似乎无法从 JavaCard 中找出任何关于出错的错误。有谁知道出了什么问题?或者有人有关于如何在 JavaCard 上进行 key 交换的工作示例吗?

最佳答案

正如 vojta 已经指出的那样:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);

只是尝试生成一个 key 对,它可能会在一定程度上起作用。但是 Fp 曲线不同于 F2m 曲线,据我所知,没有 163 位 Fp 曲线(无论如何据我所知)。

这意味着您实际上从未安装域参数,除非您生成了自己的域参数,我认为这不太可能。

使用已知 key 长度的 Fp 曲线并设置参数,至少对于公钥(对于 JCOP 卡,您可能还必须为私钥设置它们)。为了安全起见,您通常会使用 224 位或更高长度的 key 。

关于java - 椭圆曲线 Diffie Hellman 如何结合 Java 在 JavaCard 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562264/

相关文章:

尝试学习 for 循环时出现 Java 语法错误

java - 如何排除对象属性

Javacard 脚本生成器

bouncycaSTLe - 访问 PFX 文件 ECC 私钥以在 Java 中生成对称 key

c - 在c中找到段错误的解决方案

java - Java中的嵌套数据结构(内部类)

java - 是否可以使用 Play Framework 将日志消息发送到不同的文件?

smartcard - JavaCard:小程序的实例如何调用另一个实例的上下文中的方法?

smartcard - ISO 7816 - 标签列表、标题列表和扩展标题列表

cryptography - 如何执行 ECKA 并返回 ECPoint?