【发布时间】:2013-08-10 07:06:54
【问题描述】:
我想知道,一种散列方式怎么可能?你怎么能只在一个方向而不是另一个方向编码一个字符串?如果你把算法倒过来,你就不能解码md5之类的东西吗?以前,对我来说,唯一可能的方法是让它生成一个随机答案,而不是使用算法。但它每次都以相同的方式散列。请给我解释一下。
【问题讨论】:
我想知道,一种散列方式怎么可能?你怎么能只在一个方向而不是另一个方向编码一个字符串?如果你把算法倒过来,你就不能解码md5之类的东西吗?以前,对我来说,唯一可能的方法是让它生成一个随机答案,而不是使用算法。但它每次都以相同的方式散列。请给我解释一下。
【问题讨论】:
如果你“反转”算法,你就无法取回原始字符串,因为可能的字符串比可能的哈希码多。
想想一个算法,它的结果是 64 位整数。有 2^64 = (2^8)^8 = 256^8 个可能的数字。
但这意味着,如果有超过 256^8 个可能的字符串,那么必须有两个哈希值相同的字符串(这称为the pigeonhole principle)。由于长度为 9 的字符串较多(256^9 个这样的字符串),因此您可以获得哈希值这一事实并不能保证您可以“返回”。
【讨论】:
一方面,MD5 摘要(通常)比消息短得多,因此许多消息可能会生成相同的摘要。另一方面,对消息的任何微小更改都会产生完全不同的摘要。因此,可以快速判断摘要是否对应于给定的消息,但没有反向算法可以将摘要转换为合理的消息。
【讨论】:
在散列的情况下,正如其他人所指出的那样,不可逆性仅仅是因为数十亿的输入都散列到相同的输出,因此即使原则上也无法逆转。
但是您的问题似乎暗示您想知道即使在 1 对 1 的情况下,如何也有可能具有确定性但不可逆的转换过程,这确实是可能的。例如,标准块加密。明文从一组位转换为相同大小的不同位组(密文)。这是完全可逆的,但是加密和解密都需要额外的信息——一个由发送者和接收者共享的“密钥”值,但没有其他人共享。因此,转换是不可逆的,只是因为密钥是秘密的——如果攻击者得到了密钥,他也得到了消息。
公钥加密是另一个完整的蜡球。在这种情况下,“活板门”来自这样一个事实,即某些操作虽然原则上是可逆的,但在一个方向上比在另一个方向上更难执行。例如,如果你有两个非常大的素数,你可以以毫秒为单位将它们相乘;但如果只给你产品,则需要几个世纪才能发现主要因素。因此,如果您知道这两个因素,您可以基于它们计算两个单独的“键”,其中一个是另一个的倒数。如果你只给发送者一个密钥,他不能在不知道因素的情况下计算另一个,但他可以用你给他的密钥加密消息,只有你可以解密。这使它更安全——您只需将密钥发布在您的网页上即可将其提供给他,并且只要您对自己的反向私钥保密,任何人都无法解密该消息。
【讨论】:
倒不是不可能,只是不切实际。
散列从输入中删除信息:有无限多的字符串,但只有有限数量的散列。许多哈希对应于无限数量的字符串,因此通常不可能进行 1 对 1 的反转。但这并不意味着您不能生成一组匹配的输入。
如果您尝试反转像 md5 这样的哈希算法,您很快就会发现算法的每个步骤都有多个中间值对应于该步骤产生的输出,或者不可能产生输出,因此您采用了在某些时候转错了方向,不得不原路返回。检查每个组合需要很长时间。
【讨论】: