这就是我所知道的:
生成RSA Public&私钥
RSA *pRSA = NULL;
EVP_PKEY* pKey = NULL;
pRSA = RSA_generate_key(2048,RSA_3,gen_callback,NULL);
pKey = EVP_PKEY_new();
if(pRSA && pKey && EVP_PKEY_assign_RSA(pKey,pRSA))
{
/* pKey owns pRSA from now */
if(RSA_check_key(pRSA) <= 0)
{
fprintf(stderr,"RSA_check_key failed.\n");
EVP_PKEY_free(pKey);
pKey = NULL;
}
}
将密钥(EVP_KEY)转换为unsigned char,以便我可以存储到文件中。
注意:我确实知道如何写入和读取PEM文件,但我想实现它,以便我可以将密钥保存到我自己的文件格式中,原因有很多。
//Convert to public key
int pkeyLen;
unsigned char *ucBuf, *uctempBuf;
pkeyLen = i2d_PublicKey(pKey, NULL);
ucBuf = (unsigned char *)malloc(pkeyLen+1);
uctempBuf = ucBuf;
i2d_PublicKey(pKey, &uctempBuf);
//Convert to Private Key
int pkeyLen2;
unsigned char *ucBuf2, *uctempBuf2;
pkeyLen2 = i2d_PrivateKey(pKey, NULL);
ucBuf2 = (unsigned char *)malloc(pkeyLen2+1);
uctempBuf2 = ucBuf2;
i2d_PrivateKey(pKey, &uctempBuf2);
使用RSA加密消息
(encrypt_len2 = RSA_public_encrypt(strlen(msg),msg,(unsigned char*)encrypt2,pRSA, RSA_PKCS1_OAEP_PADDING)
我知道如何使用以下方法将unsigned char转换回EVP: d2i_PublicKey&amp; d2i_PrivateKey
然而,这是我不知道的,并希望有人这样做:
如何将我的EVP_KEY(公共和私人)转换回RSA结构
(示例:使用RSA_generate_key后返回的RSA * pRSA)?
答案 0 :(得分:0)
终于找到了我的问题的解决方案。希望这能帮助那些面临同样问题的人。
char *ct = "This the clear text";
unsigned char *buf;
unsigned char *buf2;
int lenss;
/* No error checking */
buf =(unsigned char*) malloc(EVP_PKEY_size(rsaPubKey));
buf2 =(unsigned char*) malloc(EVP_PKEY_size(rsaPubKey));
lenss = RSA_public_encrypt(strlen(ct)+1,(unsigned char*) ct, buf, rsaPubKey->pkey.rsa,RSA_PKCS1_PADDING);
if (lenss != EVP_PKEY_size(rsaPubKey))
{
fprintf(stderr,"Error: ciphertext should match length of key\n");
exit(1);
}
RSA_private_decrypt(lenss, buf, buf2, rsaPrivKey->pkey.rsa,RSA_PKCS1_PADDING);
printf("%s\n", buf2);
通过openssl示例目录中的一个代码找到了我的解决方案。 :)