我的问题看起来像这样。我已经在卡和终端侧生成了密钥。我在终端机上有卡的公钥和私钥,在终端机上有公钥和私钥,在卡端也是如此(我正在做测试,所以这就是为什么我将它们全部放在终端机和卡上)的原因。当我为私有卡生成密钥协议(终端侧)时,为私有卡生成终端的密钥协议相同,因此生成成功,我得到一个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。

10-07 23:12