说我有一条消息A,我用AES使用密码P加密到我的加密消息B.在存储B期间,一些位翻转。所以我得到的消息B'与B非常相似。
如果我使用正确的P解密B',我会得到一个类似于A的解密按摩A'
答案 0 :(得分:2)
这实际上取决于您使用的mode of operation。 AES是分组密码。因此,实际的AES算法仅针对128位的块定义。其他一切都是模式。
例如:
对于 ECB 分别对每个块执行AES。这意味着只有那些包含翻转位的块不同。但由于AES很强,它们的差异程度很大(平均64位或块大小的一半) 1 。
对于加密期间的 CBC ,每个明文块与先前的密文块进行异或,然后进行AES加密。第一个块是" public"随机四。在解密期间,AES解密输出与先前的密文块进行异或。因此,包含翻转位的块在A和A之间是完全不同的。 1 。
每个坏块之后的每个块都有相同的位翻转,这些位在B'中引入。之后的街区不会被改变。这意味着当你解密B'时,A'与A匹配,不包括包含翻转的块及其直接后续块。
对于 CTR ,每个明文位与通过加密计数器生成的密钥流的位进行异或。因此,CTR只会影响一位。
要实际检测更改,您应该使用MAC。无论您在明文上使用MAC还是密文都取决于您,但您应该阅读:Should we MAC-then-encrypt or encrypt-then-MAC?。或者,如果您不使用MAC,请使用GCM等经过身份验证的模式。
那些流行的模式会产生一个明文,根据位翻转的数量,它根本不会发生变化。
1 像AES那样的分组密码的构造方式是明文/密文的微小变化会导致加密/解密后的密文/明文发生很大的变化。
答案 1 :(得分:1)
这更多地是操作模式的问题而不是使用的分组密码。有些模式只能翻转一个比特(CTR),但也有一些模式可以随机化所有比特(BiIGE),这些模式由例如OpenSSL的。影响明文的密文中的比特错误的加密属性称为错误传播。
CTR是一种计数器模式。它创建一个仅使用底层块密码的加密函数的密钥流 - 根本不使用解密函数。甚至可以预先计算该密钥流,或者从特定偏移生成该密钥流。明文与密钥流简单地进行异或,以产生密文。解密过程与加密过程完全相同(具有相同值的双XOR是识别函数:a ^ k ^ k = a)。因此,CTR设计只有一点改变。
另一方面,如果仅改变一位密文,则BiIGE专门设计用于产生随机明文。 BiIGE代表Bi-directional Infinite Garble Extension。换句话说,旨在传播错误,并确保明文的第一部分也是乱码。 BiIGE要求您对每个明文块使用两次分组密码,因此效率不高。至于ECB,CBC,CFB,OFB都有不同的错误传播属性,但它们并不是非实质性的,所以我甚至不会列出它们。
但是,通常如果您想避免明文更改,只需保护密文不受更改的影响。这可以通过在密文上使用MAC或HMAC添加认证标签来实现,并且 - 如果通过不安全的信道进行通信 - IV。还有一些经过身份验证的模式,如GCM和EAX,可自动创建身份验证标记。 MAC,HMAC和认证模式提供密文的完整性和真实性。
GCM,EAX和CCM只是在内部使用CTR模式;身份验证标记已经提供了足够的保护:在使用明文之前验证将失败(正确应用时)。
维基百科这样说:
在广泛使用消息身份验证代码和经过身份验证的加密之前,通常会讨论"错误传播"属性作为操作模式的选择标准。例如,可能会发现,发送的密文中的一个块错误会导致ECB模式加密的重构明文出现一个块错误,而在CBC模式下,这样的错误会影响两个块。
有些人认为,面对随机错误(例如线路噪音),这种弹性是可取的,而另一些人则认为纠错会增加攻击者恶意篡改信息的范围。
但是,当使用适当的完整性保护时,将导致整个消息中的这种错误(很有可能)被拒绝。如果需要抵抗随机误差,则应在传输之前将纠错码应用于密文。
因此,BiIGE is not used much让您大吃一惊。它不会让你感到惊讶,大多数问题中的代码甚至StackOverflow上的答案都没有创建认证标签,即使真的需要使用它。