c - pem 的 openssl Diffie Hellman 公钥

标签 c openssl

我正在使用 openssl 构建一个系统。 我们将使用 Diffie Hellman 在各方之间共享信息。

我已经能够使用 openssl 创建 DH。 现在我想使用 PEM 格式将公钥发送给客户端,但我找不到任何将 DH 公钥转换为 PEM 格式的函数。

有人知道如何进行这种转换吗?

这里有我用来生成 DH 结构的代码:

BIGNUM * p = NULL, * g = NULL;

//Create DH MOD Group
DH * dh = dh_new_group14();
if (!dh)
    puts("DH_new failed");

//Check everything is OK
int codes = 0;
if (!DH_check(dh, &codes))
    puts("DH_check failed");

//Generate DH key
if (!DH_generate_key(dh))
    puts("DH_generate_key failed");

我也能够构建一个 ASN1_INTEGER 结构,但我还是找不到任何函数来从这个结构生成 PEM。

最佳答案

好的,我想我已经接近了。 我设法获得了一个 Java 示例,它生成的是:

SEQUENCE {
  SEQUENCE {
     OBJECTIDENTIFIER 1.2.840.113549.1.3.1
     SEQUENCE {
        INTEGER 0x00ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff
        INTEGER 0x02 (2 decimal)
     }
  }
  BITSTRING 0x0282010100b9c13521bc982e69de3e139d2521f32187ca932fdb579344c37cf2a8effb1c589ac27446656c911aefb84c961be5c389cabae7012b9edbec439ce5b57df4ad427e8baaa334c18c8bbf0fc3b19b197d484ae174f3fb538183368cdb11ecc228fc3fbb0029ff9aa0c06ccebbba47c1d1208410e9506cc08ae3bdc71924e95ae74994268822637ad628af95cf8b09cba0e070c7a8126921f6a700792ef45d844b8812f4d67f19bbc809ad33ac1ea59f4e3a9542e26b3a5f1738de6b9f8092c5a323747a716f39a17f879b87981c00944c8e5fb8f1e4d5ace6c81c182f80711bc55865c8562688b7084ae42f706fb80081f9e97982ef0242df221b202cee9b9ffcaf : 0 unused bit(s)
}

但是我使用 PEM_write_bio_DHparams 得到的结果几乎相同,只是没有 BITSTRING 和 OBJECTIDENTIFIER。

SEQUENCE {
  INTEGER 0x00ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff
  INTEGER 0x02 (2 decimal)
}

关于问题出在哪里的任何线索?

我看到 Java 版本生成 X.509 证书来发送数据,也许我应该在我的 C++ 版本上从 DH 生成 X509 证书?

关于c - pem 的 openssl Diffie Hellman 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153043/

相关文章:

c - 具有优先级的男女通用卫生间算法

c - C 中表达式的问题

openssl - 如何创建自己的自签名根证书和中间 CA 以导入 Java keystore ?

php - openssl_pkey_get_private 返回 false

c - 返回 C 中静态常量变量的地址

c++ - 为什么我不允许将返回 const char* 的函数的结果分配给 char*,但可以将字符串文字(常量)分配给 char*?

c - 如何从不同目录读取文件然后将其打印到c中的屏幕

c++ - unique_ptr 和 OpenSSL 的 STACK_OF(X509)*

ssl - 如果我想限制对特定服务器组的 SSL/DTLS 访问,只比较 Base64/pem 文件有什么问题?

ruby - 如何在 Mac 上为 Ruby 添加根 CA 证书