为了账号安全,请及时绑定邮箱和手机立即绑定

Java Diffie hellman 初始化 ECDHKeyAgreement

Java Diffie hellman 初始化 ECDHKeyAgreement

饮歌长啸 2023-07-28 16:31:22
我有一个像这样的 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());     }}有没有办法多次重新初始化ECDH KeyAgreement?这是我的测试用例:客户端初始化DH并生成公钥。客户端将公钥发送到服务器。服务器用客户端密钥初始化DH并生成自己的公钥并生成共享密钥。服务器将公钥发送给客户端。客户端使用服务器公钥生成共享密钥。在此步骤中,客户端和服务器具有公钥和共享秘密。我的问题是客户端断开连接()和 KeyAgreement 由单例对象初始化,并且不会第二次重新初始化。有时我需要做这个课题。请指导我解决这个问题。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

IllegalStateException (Phase already executed)似乎尤其是由 SunEC 提供商的 ECDH 实现引起的。init如果紧接在 之前执行(附加),则不会发生异常doPhase。但是,这个init-call 应该不是必需的,因为在执行doPhase-call后,应该将-instance 重置为 -call 后的状态,至少根据-documentation:generateSecretKeyAgreementinitgenerateSecret

此方法将此 KeyAgreement 对象重置为最近调用 init 方法之一后所处的状态...

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

注意:第二个参数 ( lastPhase)doPhase应该设置为 true,否则IllegalStateException (Only two party agreement supported, lastPhase must be true)会生成一个(至少对于 ECDH)。

查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信