2012-08-16 143 views
1

我想在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格式。我已经环顾四周,但无法找到正确的功能。任何提示?

回答

4

如果您确实需要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将为只读。

+0

我将如何导出到PKCS#1 DER(没有base64的东西)。那么其他一些格式(PKCS#8,PKCS#12等)呢? – Uri 2012-08-21 18:23:39

+1

@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

+0

另外,根据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