2014-03-07 97 views
1

當PHP使用openssl_encrypt()函數來加密與AES-256-CBC的字符串作爲加密方法:長度使用AES-256-CBC

$encrypted = openssl_encrypt($data, "AES-256-CBC", $key, 0, $iv); 

我嘗試不同串長度爲$data,當$data達到16字節的倍數時,結果長度$encrypted將增加。但看起來增長並不穩定。 是否有一個通用公式,涉及$data$encrypted的長度?

+0

這已經被回答了:http://stackoverflow.com/questions/3283787/size-of-data-after-aes-encryption –

+0

但是當我嘗試時,結果不符合公式中的答案上面的鏈接。例如,當數據分別爲0-15字節,16-31字節,32-47字節和48-63字節時,加密的長度分別是32,60,88和120字節。 – LaBird

回答

1

讓我從https://stackoverflow.com/a/3717552/2393787

隨着CBC模式引述,輸入數據必須具有塊長度的長度的多個,所以它通常加入PKCS#5填充:如果塊長度爲n,那麼至少添加1個字節,最多n個,使得總大小爲n的倍數,並且最後添加的字節(可能全部)具有數值k,其中k是添加字節的數量。解密後,只需查看最後解密的字節即可恢復k,從而知道必須刪除多少個填充字節。

因此,使用CBC模式和AES,假設PKCS#5填充,如果輸入數據的長度爲d,則加密長度爲(d + 16) & ~15。我在這裏使用類C符號;以純即,長度爲d + 1和d + 16,和16。

此狀態的多個之間,即加密的數據的長度不能與CBC來預測。你應該考慮轉向另一種模式。