【问题标题】:How to do Diffie Hellman Key Generation and retrieve raw key bytes in Java如何在 Java 中生成 Diffie Hellman 密钥并检索原始密钥字节
【发布时间】:2013-10-19 19:56:56
【问题描述】:

我正在用 Java 为现有程序编写测试工具。作为其中的一部分,我需要生成一个 Diffie Hellman 密钥对并将公钥以其原始(即未编码的字节)形式传递给其他程序。

我可以使用以下代码成功获得密钥对:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman");
kpg.initialize(512);
KeyPair dkp = kpg.generateKeyPair();

但是,我似乎无法检索键的原始字节值 :-( 调用 dkp.getPublic().getEncoded() 返回一个字节数组,但它的键采用 x509 编码格式。

我想到了三种可能的前进方式:

  1. 找到一些方法,以原始形式从上面获取关键数据。
  2. 将密钥的 x509 编码解码为其原始形式
  3. 以允许访问原始密钥的不同方式生成密钥

但我不知道如何去做其中的任何一个(结果会是最好的)?

任何帮助或建议将不胜感激!

【问题讨论】:

    标签: java cryptography public-key-encryption diffie-hellman


    【解决方案1】:

    您可以像这样获取 X 和 Y(Y = G^X mod P)值:

     BigInteger x = ((javax.crypto.interfaces.DHPrivateKey) dkp.getPrivate()).getX();
     BigInteger y = ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getY();
    

    您可以像这样从公钥或私钥中获取 G 和 P 值:

    DHParameterSpec params = 
        ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getParams();
    BigInteger p = params.getP();
    BigInteger g = params.getG();
    

    从那里您可以将它们全部作为原始字节数组获取:

     byte[] xBytes = x.toByteArray();
     byte[] yBytes = y.toByteArray();
     byte[] pBytes = p.toByteArray();
     byte[] gBytes = g.toByteArray();
    

    Y、P 和 G 的组合构成公钥。 X 应该保密。

    【讨论】:

    • 刚开始尝试这个,效果很好 :-) 非常感谢您的帮助。
    • @ataylor Nice...但是如何使用服务器公钥获取对称密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多