Diffie Hellman JavaCard

Diffie Hellman JavaCard,java,javacard,diffie-hellman,Java,Javacard,Diffie Hellman,我对JavaCard上的DiffieHellman有问题。我有这门课: ()(它的文件更大,所以我上传到pastebin,不确定这是否有问题) 然后我创建了它的两个实例,并像这样调用它(仅显示一个实例): 霍蒂和卡蒂是公众价值观。我在桌面应用程序上试用过它,所以我保证与JavaCard的通信没有问题。所以我的问题是,在所有这些共享秘密不同之后,我不知道为什么,因为我通过RSA的解密执行Y=G^bobPrivKey mod P来获得Y的传输,然后通过RSA的解密执行s=Y^a mod P 提前感谢

我对JavaCard上的DiffieHellman有问题。我有这门课: ()(它的文件更大,所以我上传到pastebin,不确定这是否有问题)

然后我创建了它的两个实例,并像这样调用它(仅显示一个实例):

霍蒂和卡蒂是公众价值观。我在桌面应用程序上试用过它,所以我保证与JavaCard的通信没有问题。所以我的问题是,在所有这些共享秘密不同之后,我不知道为什么,因为我通过RSA的解密执行Y=G^bobPrivKey mod P来获得Y的传输,然后通过RSA的解密执行s=Y^a mod P

提前感谢您的回答。

(假设您使用的是桌面上的Java卡API仿真)

jCardSim存在一个问题,即它总是使用CRT私钥(如所使用的
rsakepairgenerator
总是生成CRT私钥,这些私钥总是实现
RSAPrivateCrtKeyParameters
——请参阅和)

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

真正的问题是,
RSAPrivateCrtKeyImpl
类在执行实际加密时忽略模数的值:

:

--不使用
模数
字段:

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组素数的参数无效,使用原始(生成的)模

祝你好运

(假设您在桌面上使用Java卡API仿真)

jCardSim存在一个问题,即它总是使用CRT私钥(如所使用的
rsakepairgenerator
总是生成CRT私钥,这些私钥总是实现
RSAPrivateCrtKeyParameters
——请参阅和)

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

真正的问题是,
RSAPrivateCrtKeyImpl
类在执行实际加密时忽略模数的值:

:

--不使用
模数
字段:

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组素数的参数无效,使用原始(生成的)模


祝你好运

呃,我们可以假设2048位DH在您的卡实现中不可用吗?我在桌面上尝试过它(即使没有卡),您是否在桌面上使用它来模拟javacard API?或者其他什么?这是你在PC端的代码,你能提供javacard小程序的代码吗?呃,我们可以假设2048位DH在你的卡实现上不可用吗?我在桌面上尝试过它(即使没有卡),你在桌面上用它来模拟javacard API吗?这是你在PC端的代码,你能提供javacard小程序的代码吗?
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());
}