由diffie hellman密钥交换生成的共享秘密的密钥导出函数

时间:2016-02-08 08:59:16

标签: java cryptography

如何进一步使用由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曲线点吗?

1 个答案:

答案 0 :(得分:1)

生成的共享密钥始终是曲线点。这就是为什么你不应该直接使用ECDH秘密的原因,因为所有秘密的整个空间中只有一些秘密是曲线点,而结果中的一些比特是“弱”的 - 可以通过所选椭圆曲线的知识来预测。

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

  1. 使用一些安全散列算法(SHA256,SHA512)散列ECDH的结果。
  2. 取哈希的前16个字节
  3. 创建AES密钥。
  4. 注意:

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