使用AES-256-CBC的加密文本长度

时间:2014-03-07 10:53:28

标签: encryption aes

在PHP中使用openssl_encrypt()函数加密使用AES-256-CBC作为加密方法的字符串时:

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

我为$data尝试了不同的字符串长度,当$encrypted达到16个字节的倍数时,$data的结果长度将会增加。但似乎增长并不稳定。 是否有一个与$data$encrypted的长度相关的通用公式?

1 个答案:

答案 0 :(得分:2)

让我引用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无法预测加密数据的长度。您应该转到另一种模式。