openssl在C中创建rsa密钥对并将其导出
问题描述:
我想在C/C++中创建一个RSA密钥对并将其导出为字符串以便与之配合使用。openssl在C中创建rsa密钥对并将其导出
我设法创建密钥
rsa = RSA_generate_key(bits, exp, NULL, NULL);
if(RSA_check_key(rsa)!=1){
std::cout << "Error while checking key" << std::endl << std::flush;
}
pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
从这个角度,我可以写与PEM_write_PUBKEY()和PEM_write_PrivateKey()的私有和公共密钥的文件。但是我想要做的就是直接从pkey中将私钥和公钥从变量中获取,最好是PEM格式。我已经环顾四周,但无法找到正确的功能。任何提示?
答
如果您确实需要PEM表示,那么PEM_write_bio_RSA_PUBKEY()
和PEM_write_bio_RSAPrivateKey()
(及其对应的read
)是您想要的功能;给他们内存BIO让他们写入内存缓冲区。
您可以通过调用例如内存来创建内存BIO
。
BIO * b = BIO_new(BIO_s_mem());
并通过调用
void * buf;
BIO_get_mem_ptr(b, &buf);
获得内存缓冲区您还可以创建一个存储BIO
通过调用例如围绕现有内存
BIO * b = BIO_new_mem_buf(buf, 9001)
但生成的BIO
将为只读。
我将如何导出到PKCS#1 DER(没有base64的东西)。那么其他一些格式(PKCS#8,PKCS#12等)呢? – Uri 2012-08-21 18:23:39
@Uri对于DER,你需要'i2d_ *'函数族,它将内存缓冲区作为第二个参数。要在PKCS8中导出,您需要“PEM_write_bio_PKCS8PrivateKey”或“i2d_PKCS8PrivateKey_bio”,具体取决于格式。要导出一个PKCS12对象,你需要'i2d_PKCS12_bio',但是你必须先用'PKCS12_create'构造PKCS12。 – atomicinf 2012-08-21 19:31:01
另外,根据openssl文档,RSA_generate_key现在已被弃用,您应该使用RSA_generate_key_ex - http://www.openssl.org/docs/crypto/RSA_generate_key.html – geekonedge 2014-01-09 20:42:53