2012-09-21 31 views
0

我使用这个简单的功能,用于解密AES加密的字符串OpenSSL的解密文本长度

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

当你说“字符串”时,我假设你的意思是零终止的文本字符串。加密过程取决于密码块的大小,通常是填充。实际上编码和解码的内容取决于应用程序......这些都是密码的二进制数据。如果你的文本字符串小于解密过程返回的字符串,你的应用程序需要确定有用的部分。例如,如果你知道你的字符串在结果中是零终止的,你可以得到一个简单的strlen长度。当然,如果你不能保证输入...可能更好的搜索结果为null直到解码的长度...

+0

+1好解释 –

1

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