Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java diffie-hellman密钥交换生成共享密钥的密钥派生函数_Java_Cryptography - Fatal编程技术网

Java diffie-hellman密钥交换生成共享密钥的密钥派生函数

Java diffie-hellman密钥交换生成共享密钥的密钥派生函数,java,cryptography,Java,Cryptography,如何进一步使用diffie-hellman密钥交换生成的共享密钥作为密钥派生函数 这是我的代码: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDH", "BC"); ECGenParameterSpec ecsp; ecsp = new ECGenParameterSpec("secp192r1"); keyGen.initialize(ecsp, new SecureRa

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

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

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

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

  • 注:


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

    谢谢@vojta,但通过执行上面代码中所示的密钥协议,我得到了16字节字符串的共享机密。关于如何获取共享秘密的任何建议。