2016-06-01 10 views
3

私は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として

+0

APDUのログはありますか? –

+1

'KeyPair.ALG_EC_FP、KeyBuilder.LENGTH_EC_F2M_163' - アルゴリズムと長さが一致しません。あなたのコードのどこかで楕円曲線のドメインパラメータを指定していますか?デフォルトの楕円曲線はないので、新しい鍵ペアを生成する前に、秘密鍵と公開鍵の両方にパラメータを入力する必要があります。 – vojta

答えて

0

はすでに示されている:

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

だけで鍵ペアを生成しようとし、それはおそらくポイントまで動作します。しかし、FpカーブはF2mカーブとは異なり、私の知る限りでは163ビットのFpカーブはありません(私の知る限り)。

これは、自分で作成していない限り、実際にはドメインパラメータをインストールしたことがないことを意味します。その可能性は低いです。

既知の鍵長のFpカーブを使用し、公開鍵(少なくともJCOPカードの場合は秘密鍵に設定する必要があるかもしれません)ではパラメータを設定します。安全のためには、通常は224ビット以上のキーサイズを使用します。

関連する問題