迪菲赫尔曼 JavaCard
Diffie Hellman JavaCard
我对 JavaCard 上的 DiffieHellman 有疑问。我有这个 class:
https://pastebin.com/2F2sQ2Pe (https://github.com/ASKGLab/DHApplet)(它的文件更大所以我上传到 pastebin 不确定它是否有问题)
然后我创建了它的 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 是 public 值。我在桌面应用程序上尝试过,所以我保证与 JavaCard 通信没有问题。所以我的问题是,在所有这些 SharedSecret 不同之后,我不知道为什么,因为我通过 RSA 的解密执行 Y = G^bobPrivKey mod P 来获取 Y 的传输它们,然后执行 S = Y^a mod p 通过 RSA 的解密。
提前感谢您的回答。
(假设您在桌面上使用 jCardSim 用于 Java 卡 API 仿真)
jCardSim 有一个问题,它总是使用 CRT 私钥(因为使用 RSAKeyPairGenerator
总是生成 CRT 私钥,它总是实现 RSAPrivateCrtKeyParameters
-- 见 here and here)。
所以每个 jCardSim RSA 私钥(即使是用 ALG_RSA
生成的私钥)都是由 RSAPrivateCrtKeyImpl
实现的(你可以用 .getClass().getCanonicalName()
检查自己)。
真正的问题是 RSAPrivateCrtKeyImpl
class 在进行实际加密时忽略了模数的值:
// ...some code above skipped...
KeyWithParameters key = (KeyWithParameters) theKey;
engine.init(theMode == MODE_ENCRYPT, key.getParameters());
// ...some code below skipped...
RSAPrivateCrtKeyImpl.getParameters() -- 没有使用 modulus
字段:
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());
}
因此用于设置所需 DH 组素数的 setModulus()
call 无效,并且使用原始(生成的)模数。
祝你好运!
我对 JavaCard 上的 DiffieHellman 有疑问。我有这个 class: https://pastebin.com/2F2sQ2Pe (https://github.com/ASKGLab/DHApplet)(它的文件更大所以我上传到 pastebin 不确定它是否有问题)
然后我创建了它的 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 是 public 值。我在桌面应用程序上尝试过,所以我保证与 JavaCard 通信没有问题。所以我的问题是,在所有这些 SharedSecret 不同之后,我不知道为什么,因为我通过 RSA 的解密执行 Y = G^bobPrivKey mod P 来获取 Y 的传输它们,然后执行 S = Y^a mod p 通过 RSA 的解密。
提前感谢您的回答。
(假设您在桌面上使用 jCardSim 用于 Java 卡 API 仿真)
jCardSim 有一个问题,它总是使用 CRT 私钥(因为使用 RSAKeyPairGenerator
总是生成 CRT 私钥,它总是实现 RSAPrivateCrtKeyParameters
-- 见 here and here)。
所以每个 jCardSim RSA 私钥(即使是用 ALG_RSA
生成的私钥)都是由 RSAPrivateCrtKeyImpl
实现的(你可以用 .getClass().getCanonicalName()
检查自己)。
真正的问题是 RSAPrivateCrtKeyImpl
class 在进行实际加密时忽略了模数的值:
// ...some code above skipped...
KeyWithParameters key = (KeyWithParameters) theKey;
engine.init(theMode == MODE_ENCRYPT, key.getParameters());
// ...some code below skipped...
RSAPrivateCrtKeyImpl.getParameters() -- 没有使用 modulus
字段:
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());
}
因此用于设置所需 DH 组素数的 setModulus()
call 无效,并且使用原始(生成的)模数。
祝你好运!