Javacard KeyAgreement 不同于 BouncyCastle KeyAgreement

Javacard KeyAgreement differs from BouncyCastle KeyAgreement

我的问题是这样的。我已经在卡和终端端生成了密钥。我在终端端有卡 public 和私钥,终端 public 和私钥,在卡端也一样(我正在做测试,所以这就是为什么我把它们都打开终端和卡上)。当我为卡片生成 KeyAgreement(终端端)作为私有卡和终端作为私有时,扇区是相同的,所以生成是好的,我得到一个 24 字节(192 位)的秘密。当我在卡上生成秘密时(2 个案例,如在终端上),秘密也相同,但它们更短 - 20 字节(160 位)。这是生成代码。航站楼:

ECPublicKey publicKey;
ECPrivateKey privateKey;

...

KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC");
aKeyAgree.init(privateKey);
aKeyAgree.doPhase(publicKey, true);
byte[] aSecret = aKeyAgree.generateSecret();

和卡方:

eyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
short length = terminalEcPublicKey.getW(array, (short) 0);

keyAgreement.init(cardEcPrivateKey);
short secretlength = keyAgreement.generateSecret(array, (short)0, length, buffer, (short)0);

您在终端端实施 KeyAgreement.ALG_EC_SVDP_DH 时出现问题。这种密钥协商方法的正确输出长度应始终为 20 个字节,因为正在对派生输出执行 SHA-1。

因此在您的终端端,您应该在生成秘密数据后执行 SHA-1。