首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elliptic Curve Diffie Hellman如何在JavaCard上与Java结合使用?

Elliptic Curve Diffie Hellman如何在JavaCard上与Java结合使用?
EN

Stack Overflow用户
提问于 2016-06-01 15:35:51
回答 1查看 780关注 0票数 5

我正在尝试让Elliptic Curve Diffie Hellman在JavaCard (2.2.1版)上工作。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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调用,其中小程序似乎只是崩溃。如果我省略了调用,并返回其他数据,这将很好地工作。其中我导入了终端发送的数据。在终端中,我有以下内容:

代码语言:javascript
复制
// 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上进行密钥交换的有效示例?

EN

回答 1

Stack Overflow用户

发布于 2016-08-21 06:28:03

正如vojta已经指出的那样:

代码语言:javascript
复制
keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);

只是尝试生成一个密钥对,它可能会工作到某一点。但是Fp曲线不同于F2m曲线,据我所知没有163位Fp曲线(据我所知)。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37562264

复制
相关文章

相似问题

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