如何在Java中生成Diffie-Hellman密钥并检索原始密钥字节
我正在用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(); 但是,我似乎无法检索到键的原始字节值
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DiffieHellman");
kpg.initialize(512);
KeyPair dkp = kpg.generateKeyPair();
但是,我似乎无法检索到键的原始字节值:-(调用dkp.getPublic().getEncoded()
返回一个字节数组,但返回的是x509编码格式的键
我想到了三种可能的前进方式:
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…但是如何使用服务器公钥获取对称密钥呢。