【问题标题】:Length of Encrypted Text using AES-256-CBC使用 AES-256-CBC 的加密文本长度
【发布时间】:2014-04-10 11:34:42
【问题描述】:

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

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

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

【问题讨论】:

  • 这个已经回答了:stackoverflow.com/questions/3283787/…
  • 但是当我尝试时,结果不符合上述链接答案中的公式。比如data分别为0-15字节、16-31字节、32-47字节和48-63字节时,encrypted的长度分别为32、60、88和120字节。

标签: encryption aes


【解决方案1】:

让我引用https://stackoverflow.com/a/3717552/2393787

在CBC模式下,输入数据的长度必须是块长度的倍数,所以习惯上加PKCS#5 padding:如果块长度为n,则至少加1字节,最多n,这样总大小是 n 的倍数,并且最后添加的字节(可能全部)具有数值 k,其中 k 是添加的字节数。解密后,只需查看最后一个解密字节即可恢复 k,从而知道最终必须删除多少填充字节。

因此,对于 CBC 模式和 AES,假设 PKCS#5 填充,如果输入数据的长度为 d,则加密长度为 (d + 16) & ~15。我在这里使用类 C 表示法;说白了就是长度在d+1到d+16之间,是16的倍数。

这表明,您的加密数据的长度无法使用 CBC 进行预测。你应该考虑换一种模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2017-09-28
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多