2016-02-08 142 views
1

如何进一步使用Diffie hellman密钥交换生成的共享密钥来获得密钥导出函数。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曲线点?

回答

0

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

你应该做以下步骤来获得一个秘密的AES密钥:

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

注:

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

+0

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