0

我正在使用这个简单的函数来解密 AES 加密字符串

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = (unsigned char*)malloc(p_len + 128);
  memset(plaintext,0,p_len);
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  *len = p_len + f_len;
  return plaintext;
}

问题是 len 返回的值与整个解码字符串不匹配。可能是什么问题呢 ?

4

2 回答 2

2

当您说“字符串”时,我假设您的意思是一个以零结尾的文本字符串。加密过程取决于密码块大小,并且通常是填充。实际编码和解码的内容取决于应用程序......它是密码的所有二进制数据。如果您的文本字符串小于解密过程返回的字符串,则您的应用程序需要确定有用的部分。因此,例如,如果您知道结果中的字符串以零结尾,则可以通过简单的 strlen 获得长度。如果你不能保证输入当然是有风险的......可能最好在结果中搜索一个空值直到解码长度......

于 2012-09-21T13:06:40.810 回答
1

如果您在 ECB、CBC 或其他一些链接模式中使用密码,则必须将纯文本填充到长度,即密码块长度的倍数。例如,您可以查看 PKCS#5 标准。OpenSSL 中的高级函数可以为程序员透明地执行填充。因此,加密文本可以比纯文本大到额外的密码块大小。

于 2012-10-16T05:48:42.437 回答