Encryption 加密算法的抗冲突性如何?

Encryption 加密算法的抗冲突性如何?,encryption,cryptography,hash-collision,Encryption,Cryptography,Hash Collision,对于使用明文/密钥对的给定(对称或非对称)加密算法生成的给定密文,要找到生成相同密码文本的不同明文/密钥对有多困难 找到两个明文/密钥对导致相同的密码有多难 导致这个问题的是另一个可能与上述问题无关的问题: 如果您有一个密文和一个密钥,并且希望使用某个解密例程对其进行解密,该例程通常会告诉您密钥是否正确。但它怎么知道呢?它是否在结果明文中寻找某种模式,表明解密成功?在一些不同的明文中是否存在另一个关键结果,其中包含模式,并且例程也报告为“有效” 后续问题受答案和评论启发: 如果允许的明文/密钥对

对于使用明文/密钥对的给定(对称或非对称)加密算法生成的给定密文,要找到生成相同密码文本的不同明文/密钥对有多困难

找到两个明文/密钥对导致相同的密码有多难

导致这个问题的是另一个可能与上述问题无关的问题:

如果您有一个密文和一个密钥,并且希望使用某个解密例程对其进行解密,该例程通常会告诉您密钥是否正确。但它怎么知道呢?它是否在结果明文中寻找某种模式,表明解密成功?在一些不同的明文中是否存在另一个关键结果,其中包含模式,并且例程也报告为“有效”

后续问题受答案和评论启发:

如果允许的明文/密钥对在以下(或两种)方式中受到限制:

1) 明文以密钥的KCV(密钥检查值)开始

2) 明文以某个明文/密钥组合的哈希值开始


这是否会使碰撞查找变得不可行?更清楚的是,这样一个明文/密钥存在=

如果你加密一些明文(长度n),那么有2n个唯一的输入字符串,每个字符串必须产生一个唯一的密文(否则它是不可逆的)。因此,长度为n的所有可能字符串都是有效的密文。但所有钥匙都是如此。因此,对于任何给定的密文,都有2k种获取方法,每种方法都有一个长度为k的不同密钥

因此,要回答你的第一个问题:很容易!只需选择任意密钥,然后“解密”密文。您将获得与密钥匹配的明文


我不确定你所说的“例程通常会告诉你密钥是否正确”是什么意思。

检查密钥有效性的一种简单方法是在加密之前向明文中添加已知部分。如果解密没有重现这一点,那么它就不是正确的密钥


已知部分不应该是常数,因为那将是一个瞬间。但它可能是,例如,是明文的散列;如果对解密后的文本进行散列运算得到相同的散列值,则密钥可能是正确的(除了)。根据您的措辞,您的问题的答案是没有任何冲突阻力

对称情况 假设您得到了一个纯文本PT,其长度是基础分组密码的块长度的倍数。生成一个随机IV,并使用密钥K、CBC模式和无填充对纯文本进行加密

生成生成相同密文CT的纯文本PT'和密钥K'很容易。只需随机选择K’,使用密钥K’和IV解密CT,就得到了碰撞PT’

如果同时使用填充,这会变得有点复杂,但这仍然是可能的。如果使用PKCS#5/7填充,只需不断生成密钥,直到找到一个密钥,使解密文本PT'的最后八位字节为0x01。这将平均需要128次尝试

要使这种冲突查找不可行,必须使用消息身份验证码(MAC)

不对称情况 类似的情况也适用于RSA公钥加密。如果您不使用填充(这显然是不推荐的,而且可能大多数加密库都不支持),并且使用公钥(N,E)将PT加密到CT中,只需生成第二个密钥对(N',E',D'),这样N'>N,则PT'=CT^D'(mod N)将在(N',E')下加密到CT中

如果在RSA加密中使用PKCS#1 v1.5填充,则RSA私钥操作后最重要的八位字节必须为0x02,其概率约为256分之一。此外,第一个0x00值八位元必须在索引9之前出现,这将以高概率发生(约0,97)。因此,平均而言,您将必须生成平均约264个相同位大小的随机RSA密钥对,然后才能找到一个对于某些纯文本可能会生成相同密码文本的密钥对


但是,如果您使用的是RSA-OAEP填充,则私钥解密肯定会失败,除非密码文本是使用相应的公钥生成的。

而且您不可能比大小为n的密钥做得更好。嗨,奥利,刚刚投票支持这个答案,但别忘了约翰尼斯问了“给定密钥”的问题(对称或非对称)加密”,这会使答案有点复杂。填充也可能是一个问题。“例程通常会告诉您密钥是否正确”指的是最终用户加密软件,通常会通知用户提供的密钥是否是“正确”的密钥。从您链接到的wikipedia页面:“现代密码,如高级加密标准,目前不易受到已知明文攻击。”实际上,生成密钥ID的一种众所周知的方法是加密所有零的块,并可能从中删除一些信息,这称为KCV(密钥检查值)。您描述散列函数的使用和散列冲突问题的方式也令人不满意。尽管如此,还是使用了添加散列或校验和的方法。例如,在
scrypt
实用程序中;scrypt使用散列派生密钥,这与散列纯文本然后对其进行加密不同。后者是它毫无用处,因为它仍然会生成一个静态值-您不妨加密所有的零。它使用SHA256向标头添加签名以验证密码。请参阅lib/scryptenc/scryptenc中的scryptenc_设置。c@owlstead:为什么散列明文会产生静态值?如果“诸如高级加密标准之类的现代密码目前不易受到已知的明文攻击。”。那么KCV是什么