Openssl RSA在C中加密和解密
Openssl RSA encrypt and decrypt in C
我有一个示例代码,它使用 PEM 私钥加密消息并使用 PEM public 密钥对其进行解密,但最后解密结果为空。
const char * msg = "this is a test message";
//********************Encrypt*******************************
if ((pFile = fopen("private.pem", "rt")) &&
(rsa = PEM_read_RSAPrivateKey(pFile, NULL, passwd_callback, (void*)pcszPassphrase)))
{
fprintf(stderr, "Private key read.\n");
RSA_private_encrypt(strlen(msg), (unsigned char *)msg, encrypted, rsa, RSA_PKCS1_PADDING);
fclose(pFile);
}
//********************Decrypt*******************************
pFile = fopen("pubkey.pem", "rt");
if (rsa = PEM_read_RSAPublicKey(pFile, NULL, NULL, NULL))
{
RSA_public_decrypt(strlen((char *)encrypted), encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
ERR_load_crypto_strings();
char * err = (char *)malloc(130);
ERR_error_string(ERR_get_error(), err);
fprintf(stderr, "Error decrypting message: %s\n", err);
}
结果 RSA_public_decrypt 的输出是 1 但解密的字符串是空的。
错误消息:解密消息时出错:error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding
您的输入消息 msg
是一个以空字符结尾的字符串,但是当您对其进行加密以获取 encrypted
缓冲区时,它将是您传递给 [=20 的二进制缓冲区 strlen(encrypted) =]() 将无效。
所以改变
RSA_public_decrypt(strlen((char *)encrypted), encrypted,
decrypted, rsa, RSA_PKCS1_PADDING);
到
RSA_public_decrypt(RSA_size(rsa), encrypted,
decrypted, rsa, RSA_PKCS1_PADDING);
我有一个示例代码,它使用 PEM 私钥加密消息并使用 PEM public 密钥对其进行解密,但最后解密结果为空。
const char * msg = "this is a test message";
//********************Encrypt*******************************
if ((pFile = fopen("private.pem", "rt")) &&
(rsa = PEM_read_RSAPrivateKey(pFile, NULL, passwd_callback, (void*)pcszPassphrase)))
{
fprintf(stderr, "Private key read.\n");
RSA_private_encrypt(strlen(msg), (unsigned char *)msg, encrypted, rsa, RSA_PKCS1_PADDING);
fclose(pFile);
}
//********************Decrypt*******************************
pFile = fopen("pubkey.pem", "rt");
if (rsa = PEM_read_RSAPublicKey(pFile, NULL, NULL, NULL))
{
RSA_public_decrypt(strlen((char *)encrypted), encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
ERR_load_crypto_strings();
char * err = (char *)malloc(130);
ERR_error_string(ERR_get_error(), err);
fprintf(stderr, "Error decrypting message: %s\n", err);
}
结果 RSA_public_decrypt 的输出是 1 但解密的字符串是空的。
错误消息:解密消息时出错:error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding
您的输入消息 msg
是一个以空字符结尾的字符串,但是当您对其进行加密以获取 encrypted
缓冲区时,它将是您传递给 [=20 的二进制缓冲区 strlen(encrypted) =]() 将无效。
所以改变
RSA_public_decrypt(strlen((char *)encrypted), encrypted,
decrypted, rsa, RSA_PKCS1_PADDING);
到
RSA_public_decrypt(RSA_size(rsa), encrypted,
decrypted, rsa, RSA_PKCS1_PADDING);