【问题标题】:Key derivation function for Shared secret generated by diffie hellman key exchangediffie hellman 密钥交换生成的共享密钥的密钥派生函数
【发布时间】:2016-02-08 08:59:15
【问题描述】:

我如何进一步使用由 diffie hellman 密钥交换生成的共享密钥,用于密钥派生功能。

这是我的代码:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDH", "BC");

        ECGenParameterSpec ecsp;
        ecsp = new ECGenParameterSpec("secp192r1");

        keyGen.initialize(ecsp, new SecureRandom());
        // Generate RSA Assymetric KeyPair
        KeyPair alice_pair = keyGen.generateKeyPair();
        // Extract Public Key
        PublicKey alice_pub =  alice_pair.getPublic();
        // Extract Private Key
        PrivateKey alice_pvt = alice_pair.getPrivate();

  KeyAgreement alice_agreement =    KeyAgreement.getInstance("ECDH","BC");
        alice_agreement.init(alice_pair.getPrivate());
        alice_agreement.doPhase(bob_pub, true);
        byte[] alice_secret = alice_agreement.generateSecret();
        SecretKeySpec alice_aes = new SecretKeySpec(alice_secret, "AES");

        // Create KeyAgreement for Bob
        KeyAgreement bob_agreement = KeyAgreement.getInstance("ECDH","BC");
        bob_agreement.init(bob_pvt);
        bob_agreement.doPhase(alice_pub, true); 

共享密钥可以是ECC曲线点吗?

【问题讨论】:

    标签: java cryptography


    【解决方案1】:

    生成的共享密钥始终是一个曲线点。这就是为什么您不应该直接使用 ECDH 密码的原因,因为所有密码的整个空间中只有少数密码是曲线点,而结果中的一些位是“弱”的 - 可以根据所选椭圆曲线的知识进行预测。

    您应该执行以下步骤来获取秘密 AES 密钥:

    1. 使用某种安全散列算法(SHA256、SHA512)对 ECDH 的结果进行散列。
    2. 取散列的前 16 个字节
    3. 创建一个 AES 密钥。

    注意:

    您正在使用 Bouncy Castle 加密提供程序。根据其文档和源代码,您获得的共享秘密结果是编码为字节数组的所需 EC 点(java.math.BigInteger 的实例)的 X 仿射坐标。

    【讨论】:

    • 感谢@vojta,但是通过执行上面代码中所示的密钥协议,我将共享密钥作为 16 字节字符串。关于如何获取共享秘密的任何建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2023-03-19
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多