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

时间:2012-02-26 14:24:13

标签: encryption cryptography hash-collision

对于在明文/密钥对上工作的给定(对称或非对称)加密算法生成的给定密文,找到产生相同密文的不同明文/密钥对有多难?

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

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

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

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

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

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

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

这会使碰撞发现不可行吗?甚至清楚,这样的明文/密钥存在=

3 个答案:

答案 0 :(得分:9)

你的问题的答案就像你说的那样,是没有任何碰撞阻力。

对称案例 假设您有一个纯文本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。

如果您使用的是PKCS#1 v1.5的填充你的RSA加密,RSA私钥操作之后最显著八位组必须是0×02,它会随着大约在256的概率此外,第一0x00值八位字节必须在索引9之前发生,这将以高概率(大约0.97)发生。因此,平均而言,您必须平均生成大约264个相同位大小的随机RSA密钥对,然后再针对某些纯文本生成相同的密文文本。

如果您正在使用RSA-OAEP填充,则除非使用相应的公钥生成密文,否则保证私钥解密失败。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

已知部分不应该是常数,因为那将是一个瞬间crib。但它可能是例如是明文的哈希;如果散列解密文本产生相同的散列值,则密钥可能正确(hash collisions除外)。