我在JavaCard上遇到DiffieHellman问题。我有这门课: https://pastebin.com/2F2sQ2Pe(https://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。
提前回答任何答案。
答案 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()无效,并且使用原始(生成)模数。
祝你好运!