c ++ / RSA转换密钥

c++ / RSA convert key

本文关键字:转换 密钥 RSA      更新时间:2023-10-16

我正在尝试用RSA加密一些东西。

但是我的 rsa 库无法使用 x509 密钥。所以我尝试使用 openssl 将其转换为 DER 密钥。

但我真的不明白它是如何工作的。 我发现了两个看起来还可以的类,但我无法弄清楚如何使用它们。

该函数是:

-i2d_X509

-X509

我确实找到了一段代码,但我无法理解它:

 int len;
 unsigned char *buf, *p;
 len = i2d_X509(x, NULL);
 buf = OPENSSL_malloc(len);
 if (buf == NULL)
      /* error */
 p = buf;
 i2d_X509(x, &p);

如果你能帮我,那就太好了。

i2d_X509表示将X509对象从内部表示(X509结构)转换为DER编码表示(通过缓冲区或文件中复制)。

所以,在这个代码中行

len = i2d_X509(x, NULL);

您正在确定在 DER 中表示给定证书所需的缓冲区长度或字节数。

然后,你分配了那么多内存和最终语句

len = i2d_X509(x, &p);

X509 *证书以 DER 格式复制到此缓冲区中。

此缓冲区可以保留在文件中,并将其另存为证书文件,例如.cer.crt,并且可以使用任何证书工具打开。

回到您的问题,您可以将此缓冲区用于接受 DER 证书的程序。

但是你提到了钥匙,是吗?

如果您需要RSA公钥,则可以执行以下操作。

您可能需要首先使用 X509_get_pubkey 提取密钥,这将在结构EVP_PKEY提供密钥。

 EVP_PKEY * pkey;
 pkey = X509_get_pubkey(x);
 RSA * rsa;
 rsa = EVP_PKEY_get1_RSA(pkey);

现在,将此RSA结构输出到 DER 中。

int len;
unsigned char *buf, *p;
len = i2d_RSAPublicKey(rsa, buffer, buffer_length);

根据密钥将buffer分配给足够大的长度,例如 4000。

我认为这会对你有所帮助。