我正在尝试使用OpenSSL的RSA加密功能加密一些文本。我的主要问题是加密的RSA文本的长度在0到256之间变化。
我的RSA加密功能是:
/* Encrypt data using RSA */
char* rsa_encrypt(char* pub_key_filename, const unsigned char *data)
{
int padding = RSA_PKCS1_PADDING;
FILE *fp_pub;
fp_pub = fopen(pub_key_filename, "rb");
if (fp_pub == NULL)
{
printf("There was an error opening the public key file. Exiting!\n");
exit(EXIT_FAILURE);
}
RSA *pub_key = PEM_read_RSA_PUBKEY(fp_pub, NULL, NULL, NULL);
char *encrypted = malloc(2048);
int i;
for (i = 0; i < (2048); i++)
{
encrypted[i] = '\0';
}
int result = RSA_public_encrypt(strlen(data), data, encrypted, pub_key, padding);
if (result == -1)
{
printf("There was an error during RSA encryption.\n");
return "ERROR_RSA_ENCRYPTION";
}
fclose(fp_pub);
return encrypted;
}
以下代码涉及尝试加密某些文本:
const unsigned char *key = (unsigned char *)"abcdefghijklmnopqrstuvwxyzabcdef";
unsigned char *encrypted_aes_key = rsa_encrypt("public.pem", key);
我知道没有填充的RSA是原始RSA加密,结果长度在0到n之间(RSA位大小),如here所示,但我的代码使用RSA_PKCS1_PADDING,所以我不知道为什么我仍然获得可变长度输出。
答案 0 :(得分:1)
加密数据的长度在result
中从
int result = RSA_public_encrypt(strlen(data), data, encrypted, pub_key,
填充);
encrypted
中返回的加密数据是二进制数据。你不能在它上面做一个strlen。数据不会终止,并且可能包含一些随机0。