gpt4 book ai didi

Java Diffie hellman 初始化ECDHKeyAgreement

转载 作者:行者123 更新时间:2023-11-30 10:00:29 26 4
gpt4 key购买 nike

我有一个像这样的 Diffie–Hellman 安全类:

public class AESSecurityCap {

private PublicKey publicKey;
KeyAgreement keyAgreement;
byte[] sharedsecret;

AESSecurityCap() {
makeKeyExchangeParams();
}

private void makeKeyExchangeParams() {
KeyPairGenerator kpg = null;
try {
kpg = KeyPairGenerator.getInstance("EC");
kpg.initialize(128);
KeyPair kp = kpg.generateKeyPair();
publicKey = kp.getPublic();
keyAgreement = KeyAgreement.getInstance("ECDH");
keyAgreement.init(kp.getPrivate());

} catch (NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
}
}

public void setReceiverPublicKey(PublicKey publickey) {
try {
keyAgreement.doPhase(publickey, false); // <--- Error on this line
sharedsecret = keyAgreement.generateSecret();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
}

并实现了这个类:

public class Node extends AESSecurityCap {
}

有时我需要重新初始化 DH keyAgreement:

public class TestMainClass {
public static void main(String[] args) {
Node server = new Node();
Node client = new Node();

server.setReceiverPublicKey(client.getPublicKey());
client.setReceiverPublicKey(server.getPublicKey());

// My problem is this line ,
// Second time result exception
server.setReceiverPublicKey(client.getPublicKey());
}
}

但收到此异常:

Exception in thread "main" java.lang.IllegalStateException: Phase already executed
at jdk.crypto.ec/sun.security.ec.ECDHKeyAgreement.engineDoPhase(ECDHKeyAgreement.java:91)
at java.base/javax.crypto.KeyAgreement.doPhase(KeyAgreement.java:579)
at ir.moke.AESSecurityCap.setReceiverPublicKey(AESSecurityCap.java:37)
at ir.moke.TestMainClass.main(TestMainClass.java:13)

有没有办法多次重新初始化ECDH KeyAgreement?

这是我的测试用例:

  1. 客户端初始化DH并生成公钥。
  2. 客户端向服务器发送公钥。
  3. 服务器用客户端 key 初始化DH并生成自己的公钥和共享 key 。
  4. 服务器向客户端发送公钥。
  5. 客户端使用服务器公钥生成共享 key 。在这一步中,客户端和服务器有公钥和共享 key 。

我的问题是客户端 disconnected() 和 KeyAgreement 由单例对象初始化并且没有第二次重新初始化。

有时候我需要做这门课。

请指导我解决这个问题。

最佳答案

IllegalStateException(Phase already executed) 似乎是由 SunEC 提供商的 ECDH 实现引起的。如果(附加)init 则不会发生异常在 doPhase 之前立即执行.但是,这个 init 调用不是必需的,因为在 doPhase 调用之后 generateSecret被执行,这应该将 KeyAgreement 实例重置为 init 调用之后的状态,至少根据 generateSecret 文档:

This method resets this KeyAgreement object to the state that it was in after the most recent call to one of the init methods...

可能是 SunEC 提供程序中的错误。如果使用 DH 而不是 ECDH(以及 SunJCE 提供者而不是 SunEC 提供者),则行为符合预期,即重复 doPhase 调用是可能的(无需额外的 init-来电)。这同样适用于使用 BouncyCastle 的 ECDH -供应商。因此,您可以使用 BouncyCaSTLe 提供程序而不是 SunEC 提供程序来使用您的代码运行 ECDH。

注意:doPhase 中的第二个参数(lastPhase)应设置为true,否则会出现IllegalStateException(仅支持双方协议(protocol),lastPhase 必须为真) 生成(至少对于 ECDH)。

编辑:

该错误已知并已在 JDK 12 中修复,请参阅 JDK-8205476: KeyAgreement#generateSecret is not reset for ECDH based algorithmm .

关于Java Diffie hellman 初始化ECDHKeyAgreement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com