如何在Java中生成Diffie-Hellman密钥并检索原始密钥字节

如何在Java中生成Diffie-Hellman密钥并检索原始密钥字节,java,cryptography,public-key-encryption,diffie-hellman,Java,Cryptography,Public Key Encryption,Diffie Hellman,我正在用java为现有程序编写一个测试工具。作为这项工作的一部分,我需要生成一个Diffie-Hellman密钥对,并以原始(即未编码字节)形式将公钥传递给另一个程序 我可以使用以下代码成功地创建密钥对: KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman"); kpg.initialize(512); KeyPair dkp = kpg.generateKeyPair(); 但是,我似乎无法检索到键的原始字节值

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

我可以使用以下代码成功地创建密钥对:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman");
kpg.initialize(512);
KeyPair dkp = kpg.generateKeyPair();
但是,我似乎无法检索到键的原始字节值:-(调用
dkp.getPublic().getEncoded()
返回一个字节数组,但返回的是x509编码格式的键

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

  • 找到一些方法,从上面的原始数据中获取关键数据
  • 将密钥的x509编码解码为原始形式
  • 以允许访问原始密钥的不同方式生成密钥
  • 但我不知道如何去做这些事情(哪一个会是最好的)

    如果您有任何帮助或建议,我们将不胜感激。

    您可以获得如下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();
    
    DHParameterSpec params = 
        ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getParams();
    BigInteger p = params.getP();
    BigInteger g = params.getG();
    
    您可以通过公钥或私钥获取G和p值,如下所示:

     BigInteger x = ((javax.crypto.interfaces.DHPrivateKey) dkp.getPrivate()).getX();
     BigInteger y = ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getY();
    
    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…但是如何使用服务器公钥获取对称密钥呢。