如何进一步使用由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 :(得分:1)
生成的共享密钥始终是曲线点。这就是为什么你不应该直接使用ECDH秘密的原因,因为所有秘密的整个空间中只有一些秘密是曲线点,而结果中的一些比特是“弱”的 - 可以通过所选椭圆曲线的知识来预测。
您应该执行以下步骤以获取秘密的AES密钥:
注意:
您正在使用Bouncy Castle加密提供程序。根据其文档和源代码,您获得的共享秘密结果是您所需的EC点(java.math.BigInteger
的实例)的X仿射坐标,编码为字节数组。