【问题标题】:Is correct to use CBC with NoPadding in AES Encryption?在 AES 加密中使用带有 NoPadding 的 CBC 是否正确?
【发布时间】:2013-10-15 15:41:16
【问题描述】:

我目前正在使用 mcrypt.java 来加密和解密来自服务器端和客户端 cryptojs 的数据,但我遇到了一些问题,因为当我加密任何字符串时,java 和 JavaScript 都会显示不同的结果。

嗯,我正在阅读有关 AES 加密的方法和填充方案的信息,并且一些博客谈论将 CBC 模式与 NoPadding 一起使用是不正确的,并且更好/正确地将 CBC 与 Pkcs7 或其他填充一起使用。

谁能解释一下与此相关的事情?

【问题讨论】:

    标签: encryption aes cryptojs


    【解决方案1】:

    如果您在 ECB/CBC 块密码模式下执行 AES 加密,则需要填充您的明文,除非您的明文是块大小的倍数。你当然可以确保你的明文总是精确的 N 个块,但实际上你会创建自己的填充模式。

    许多库(例如 PHP 中的 mcrypt)没有指定任何填充,而他们偷偷地填充。他们只是用00 值字节填充最后一个块。这样做的效果是您可以加密 ASCII 兼容 文本,然后将 null 终止。在大多数语言(不使用空终止)中,也可以使用trim 方法来删​​除此填充。然而,这不是官方的填充模式。当然,这种方案仅在纯文本不以控制字符结尾时才有效。所以它不适用于任何二进制明文。

    使用 PKCS#7 填充绝对更好。删除 PKCS#7 填充对于 any 纯文本是确定性的。这意味着您可以加密任何值,包括 UTF-16 编码文本和任何二进制值。如果 PKCS#7 填充不可用,那么自己实现它相对容易——这当然值得付出努力。 CBC 模式的 PKCS#7 填充的唯一缺点是,当明文已经是块大小的 N 倍时,它可能需要额外的填充块。这样做的原因是明文可能会被误解为填充。

    请注意,填充和填充错误不适合检测密文是否在传输过程中被更改。填充预言机非常容易实现,并且可以以 128 倍于明文大小(以字节为单位)显示明文(!!!)。因此,如果您想为明文提供完整性和真实性,请使用经过身份验证的操作模式或 MAC(HMAC 或 CMAC)。

    如果您确实不能错过用于填充的字节,请查看 CTR 或您的分组密码的类似流操作模式。


    编辑

    还有 密文窃取 或 CTS 可用于 CBC 模式。用的不多,而且有三种不同的版本,你应该确定用的是哪一种。

    现在更常见的是使用计数器模式(CTR 模式)或基于它的认证模式(如果完全使用分组密码)。 CTR 模式不需要任何填充,因为它是一种流式操作模式。

    【讨论】:

    • 嘿,第一次投票将我的aes-tag 分数移动到197:P
    • 那么,让我们再给它一个当之无愧的 [+1] 碰撞。 ;)
    猜你喜欢
    • 2021-03-05
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2013-08-11
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多