Javacard KeyAgreement与BouncyCastle KeyAgreement不同

时间:2015-03-09 23:02:56

标签: bouncycastle javacard elliptic-curve diffie-hellman

我的问题看起来像这样。我在卡和终端侧生成了密钥。我在终端侧有卡公钥和私钥以及终端公钥和私钥,卡侧也一样(我正在做测试,这就是为什么我把它们全部放在终端和卡上)。当我为卡生成KeyAgreement(终端侧)作为私有而终端作为私有时,secters是相同的,所以生成是正常的,我得到一个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);

1 个答案:

答案 0 :(得分:5)

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

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