OpenSSL解密文本长度

时间:2012-09-21 12:25:45

标签: c++ linux openssl aes cryptoapi

我正在使用这个简单的函数来解密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返回的值与整个解码后的字符串不匹配。可能是什么问题?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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