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

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

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

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

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

我有三种可能的前进方式:

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

但我不是如何去做任何一个(哪个会变得最好)?

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

你可以得到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应该保密。