在PHP中使用openssl_encrypt()
函数加密使用AES-256-CBC作为加密方法的字符串时:
$encrypted = openssl_encrypt($data, "AES-256-CBC", $key, 0, $iv);
我为$data
尝试了不同的字符串长度,当$encrypted
达到16个字节的倍数时,$data
的结果长度将会增加。但似乎增长并不稳定。
是否有一个与$data
和$encrypted
的长度相关的通用公式?
答案 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无法预测加密数据的长度。您应该转到另一种模式。