This question already has answers here:
Closed last year.
Use OpenSSL RSA key with .Net
(1个答案)
How to generate RSA private key using OpenSSL?
(4个答案)
我需要编写一个C程序,生成一个RSA密钥,并以DER格式保存一个X.509公钥,以DER格式保存一个PKCS#8私钥。我用过谷歌,但没找到多少。到目前为止我得到的是:
这显然是在用PEM格式编写密钥。我还需要能够在代码中实际将数据存储在内存中,而不仅仅是直接将其写入文件,因为我还需要处理公钥的其他一些事情。
谢谢你的帮助
使用完PKCS8_PRIV_KEY_INFO_free()后,需要释放此结构。接下来使用i2d_PKCS8_PRIV_KEY_INFO()(或i2d_PKCS8_PRIV_KEY_INFO_fp()或i2d_PKCS8_PRIV_KEY_INFO_bio)写出PKCS8 DER。
有关这些功能的信息,请参见手册页:
https://www.openssl.org/docs/man1.1.0/crypto/i2d_RSAPublicKey.html
(1个答案)
How to generate RSA private key using OpenSSL?
(4个答案)
我需要编写一个C程序,生成一个RSA密钥,并以DER格式保存一个X.509公钥,以DER格式保存一个PKCS#8私钥。我用过谷歌,但没找到多少。到目前为止我得到的是:
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
void main() {
int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL;
int bits = 2048;
unsigned long e = RSA_F4;
// Generate the RSA key
printf("Generating RSA key...\n");
bne = BN_new();
ret = BN_set_word(bne, e);
if(ret != 1) {
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1) {
goto free_all;
}
// Save the public key in PEM format
printf("Writing key files...\n");
bp_public = BIO_new_file("public.pem", "w+");
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
if(ret != 1) {
goto free_all;
}
// Save the private key in PEM format
bp_private = BIO_new_file("private.pem", "w+");
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
// Free everything
free_all:
BIO_free_all(bp_public);
BIO_free_all(bp_private);
RSA_free(r);
BN_free(bne);
printf("Done!\n");
}
这显然是在用PEM格式编写密钥。我还需要能够在代码中实际将数据存储在内存中,而不仅仅是直接将其写入文件,因为我还需要处理公钥的其他一些事情。
谢谢你的帮助
最佳答案
您的问题有点模棱两可,实际上您的意思是“以DER格式保存一个X.509公钥”。假设您的实际意思是“将其保存为SubjectPublicKeyInfo结构”(这是持有公钥的X.509证书的位),那么您应该使用i2d_RSA_PUBKEY(或i2d_RSA_PUBKEY_fp或i2d_RSA_PUBKEY_bio)将其写出(不需要首先将其转换为EVP_PKEY)。
对于DER格式的PKCS#8私钥,您当前的方法不适合PEM格式。PEM_write_bio_RSAPrivateKey()函数将以传统格式(而不是PKCS#8)写入。
我想你不想做任何复杂的事情,比如先加密密钥。为此,您需要将其转换为EVP_PKEY(使用EVP_PKEY_assign_RSA(),如@JawguyChooser所述)。接下来,使用函数EVP_PKEY2PKCS8获得PKCS8_PRIV_KEY_INFO结构。
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
使用完PKCS8_PRIV_KEY_INFO_free()后,需要释放此结构。接下来使用i2d_PKCS8_PRIV_KEY_INFO()(或i2d_PKCS8_PRIV_KEY_INFO_fp()或i2d_PKCS8_PRIV_KEY_INFO_bio)写出PKCS8 DER。
有关这些功能的信息,请参见手册页:
https://www.openssl.org/docs/man1.1.0/crypto/i2d_RSAPublicKey.html
关于c - 以DER格式写入私钥/公钥,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48324615/