RSA加密的OpenSSL可变长度结果[C编程]

时间:2016-03-28 17:09:11

标签: c encryption openssl cryptography rsa

我正在尝试使用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,所以我不知道为什么我仍然获得可变长度输出。

1 个答案:

答案 0 :(得分:1)

加密数据的长度在result中从

返回

int result = RSA_public_encrypt(strlen(data), data, encrypted, pub_key,填充);

encrypted中返回的加密数据是二进制数据。你不能在它上面做一个strlen。数据不会终止,并且可能包含一些随机0。