如何做Diffie Hellman密钥生成并在Java中检索原始密钥字节
我正在java中为现有程序编写测试工具。 作为这个的一部分,我需要生成一个Diffie Hellman密钥对,并以其原始(即未编码的字节)forms将公钥传递给另一个程序。
我可以使用以下代码成功使用密钥对:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman"); kpg.initialize(512); KeyPair dkp = kpg.generateKeyPair();
但是,我似乎无法检索键的原始字节值:-(调用dkp.getPublic().getEncoded()
以x509编码格式返回一个字节数组,但它的Key。
我有三种可能的前进方式:
- 找到一些以原始forms从上面获取关键数据的方法。
- 将密钥的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();
您可以从公钥或私钥获取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应该保密。