2014-03-07 93 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来预测。你应该考虑转向另一种模式。