私はElliptic Curve Diffie HellmanをJava Card(バージョン2.2.1)で動かそうとしています。 JavaCardでElliptic Curve Diffie HellmanはJavaと組み合わせて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
コールを除き、動作しているようです、アプレットは単にクラッシュするようです。私がコールを外して他のデータを返すと、うまく動作します。ここでは、端末から送信されたデータをインポートします。端末には次のものがあります:
// 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上で鍵交換を行う方法の実例がありますか? vojtaとして
APDUのログはありますか? –
'KeyPair.ALG_EC_FP、KeyBuilder.LENGTH_EC_F2M_163' - アルゴリズムと長さが一致しません。あなたのコードのどこかで楕円曲線のドメインパラメータを指定していますか?デフォルトの楕円曲線はないので、新しい鍵ペアを生成する前に、秘密鍵と公開鍵の両方にパラメータを入力する必要があります。 – vojta