5

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

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

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

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

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

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

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

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

4

1 回答 1

9

您可以像这样获得 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 应该保密。

于 2013-10-11T16:48:10.313 回答