2016-02-08 141 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字節字符串的共享密鑰。任何關於如何獲得共享祕密的建議。 –