迪菲赫尔曼 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 在进行实际加密时忽略了模数的值:

AssymetricCipherImpl.init():

// ...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 无效,并且使用原始(生成的)模数。

祝你好运!