2012-09-21 65 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這樣的高級函數可以爲程序員透明地執行填充。因此,加密的文本可以比純文本大到額外的密碼塊大小。