我如何进一步使用 diffie hellman key 交换生成的共享 key 来实现 key 派生功能。
这是我的代码:
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);
共享 key 可以是ECC曲线点吗?
最佳答案
生成的共享 secret 始终是一个曲线点。这就是为什么您不应该直接使用 ECDH secret ,因为所有 secret 的整个空间中只有少数 secret 是曲线点,而结果中的一些位是“弱”的 - 根据所选椭圆曲线的知识可以预测。
您应该执行以下步骤来获取 AES key :
- 使用某种安全哈希算法(SHA256、SHA512)对 ECDH 结果进行哈希处理。
- 获取哈希值的前 16 个字节
- 创建 AES key 。
注意:
您正在使用 Bouncy CaSTLe 加密货币提供商。根据其文档和源代码,您获得的共享 secret 结果是编码为字节数组的所需 EC 点(java.math.BigInteger
的实例)的 X 仿射坐标。
关于java - diffie hellman key 交换生成的共享 secret 的 key 派生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265635/