Diffie Hellman JavaCard

时间:2017-05-02 20:22:12

标签: java javacard diffie-hellman

我在JavaCard上遇到DiffieHellman问题。我有这门课: 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不同之后我不知道为什么因为我通过RSA解密来执行Y = G ^ bobPrivKey mod P以让Y转移它们然后执行S = Y ^通过RSA解密的mod p。

提前回答任何答案。

1 个答案:

答案 0 :(得分:2)

(假设您在桌面上使用jCardSim进行Java Card API仿真)

jCardSim存在一个问题,即它始终使用CRT私钥(因为使用suchen始终生成始终实施RSAKeyPairGenerator的CRT私钥 - 请参阅here和{{3} })。

因此,每个jCardSim RSA私钥(即使使用RSAPrivateCrtKeyParameters生成的私钥)都由ALG_RSA实现(您可以使用RSAPrivateCrtKeyImpl进行检查。)

真正的问题是.getClass().getCanonicalName()类在执行实际加密时会忽略模数的值:

here

RSAPrivateCrtKeyImpl

AssymetricCipherImpl.init() - 没有使用// ...some code above skipped... KeyWithParameters key = (KeyWithParameters) theKey; engine.init(theMode == MODE_ENCRYPT, key.getParameters()); // ...some code below skipped... 字段:

modulus

因此,用于设置所需DH组素数的RSAPrivateCrtKeyImpl.getParameters()无效,并且使用原始(生成)模数。

祝你好运!