java - diffie hellman key 交换生成的共享 secret 的 key 派生函数

标签 java cryptography

我如何进一步使用 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 :

  1. 使用某种安全哈希算法(SHA256、SHA512)对 ECDH 结果进行哈希处理。
  2. 获取哈希值的前 16 个字节
  3. 创建 AES key 。
<小时/>

注意:

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

关于java - diffie hellman key 交换生成的共享 secret 的 key 派生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265635/

相关文章:

java - IBM 3624 引脚偏移生成

java - 在java中测试素数

java - 适用于 Marshaller setSchema 的 XML 模式

java - 将 String 和 Integer 与 equals 进行比较

java - .rsaEncryptionOAEPSHA256算法在iOS上与Java的兼容性

java - Java 中是否有 SignatureOutputStream(或等效的)?

javascript - IE 和 Webkit 中是否有任何内置浏览器支持加密随机数? Firefox 有 window.crypto

JAVA字典作为参数

java - JBoss5 中的 XPath 类解析

c++ - 检查 n 值的倍数作为模同余