Java Diffie hellman 初始化 ECDHKeyAgreement

我有一个像这样的 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?

这是我的测试用例:

  1. 客户端初始化DH并生成公钥。

  2. 客户端将公钥发送到服务器。

  3. 服务器用客户端密钥初始化DH并生成自己的公钥并生成共享密钥。

  4. 服务器将公钥发送给客户端。

  5. 客户端使用服务器公钥生成共享密钥。在此步骤中,客户端和服务器具有公钥和共享秘密。

我的问题是客户端断开连接()和 KeyAgreement 由单例对象初始化,并且不会第二次重新初始化。

有时我需要做这个课题。

请指导我解决这个问题。


饮歌长啸
浏览 151回答 1
1回答

Qyouu

这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)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java