2017-05-02 13 views
0

JavaCardのDiffieHellmanに問題があります。Diffie Hellman JavaCard

(その大きなファイルので、私はその問題があればわからないペーストビンするuplouded) https://pastebin.com/2F2sQ2Pehttps://github.com/ASKGLab/DHApplet)そして、私はそれの2のインスタンスを作成し、この(ショーのみのインスタンス)のようにそれを呼び出す:私はこのクラスを持っています:

DiffieHellman dh = new DiffieHellman(); 
dh.init(); 
dh.getY(hostY, (short)0); 
dh.setY(cardY, (short) 0, (short) cardY.length, (short) 0); 
AESKey encKey = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_RESET, KeyBuilder.LENGTH_AES_128, false); 
dh.doFinal(encKey); 

hostYとcardYは公開値です。デスクトップアプリで試してみましたので、JavaCardとの通信に問題はありません。だから私の質問は、このSharedSecretのすべてが相違していて、私はY = G^bobPrivKey mod PをRSAの解読で実行してYの転送を取得し、RSAの解読を介してS = Y^a mod pを実行するため、

お返事ありがとうございます。

+0

あなたのカードの実装で2048ビットのDHが利用できないと思われるかもしれませんか? –

+0

デスクトップで試しました(カードなしでも) –

+0

デスクトップ上でjavacard APIをシミュレートするには[jCardSim](https://jcardsim.org/)を使用していますか?または、他の何か? – vlp

答えて

2

RSAKeyPairGeneratorは、常に常にRSAPrivateCrtKeyParametersを実装CRT秘密鍵を生成し、使用されるように、それは常に(CRT秘密鍵を使用していることをjCardSimに問題があります(デスクトップ上のJavaカードAPIエミュレーションにjCardSimを使用していると仮定) - hereおよびhereを参照)。

したがって、すべてのjCardSim RSA秘密鍵(ALG_RSAで生成されたものも)はRSAPrivateCrtKeyImplによって実装されています(自分で.getClass().getCanonicalName()で確認できます)。

public CipherParameters getParameters() { 
    if (!isInitialized()) { 
     CryptoException.throwIt(CryptoException.UNINITIALIZED_KEY); 
    } 
    // modulus = p * q; 
    return new RSAPrivateCrtKeyParameters(p.getBigInteger().multiply(q.getBigInteger()), null, 
      null, p.getBigInteger(), q.getBigInteger(), 
      dp1.getBigInteger(), dq1.getBigInteger(), pq.getBigInteger()); 
} 
: - :

AssymetricCipherImpl.init()modulusフィールドのない使用がない

// ...some code above skipped... 
KeyWithParameters key = (KeyWithParameters) theKey; 
engine.init(theMode == MODE_ENCRYPT, key.getParameters()); 
// ...some code below skipped... 

RSAPrivateCrtKeyImpl.getParameters()

本当の問題は、実際の暗号化を行うときRSAPrivateCrtKeyImplクラスがモジュラスの値を無視するということです

setModulus() callは、目的のDHグループプライムを設定するために使用されるため、 ctと元の(生成された)モジュラスが使用されます。

幸運を祈る!

関連する問題