我一直在使用哈希和RSA(在一个非常肤浅的层面上,例如:SSH连接上的RSA身份验证),我想了解更多相关信息。
首先,我知道加密是一个可以恢复的双向过程。哈希是一个不可逆转的单向过程。
最后一点对我来说没有意义,如果我使用一个算法来散列“hello”,就不会使用相同的算法,而是“反转”(意思是,它可以“向后”工作),能够转换那个哈希值再次“打招呼”。
编辑:
感谢@GeorgDangl,@ klutt和Pete Kirkham指出我根本不理解“不可逆数学”的概念。这些例子非常有用。
从某种意义上讲,它是不可逆转的,对于每个输入,你只有一个输出,而不是相反。有多个输入产生相同的输出。
对于任何给定的输入,有很多(实际上是无限的)不同的输入会产生相同的散列。这很容易实现,因为输出具有固定的大小,但输入没有大小限制。
为此,使用了不可逆的数学运算。例如,很容易计算10%3
。答案就是10%3=1
。但是,如果我给你方程式x%3=1
,你会怎么做?这个等式适用于所有x=3*k+1
。因此,你不能得到我开始的数字。
另一个不可逆数学的例子是正弦和余弦。例如,cos(0)=1
,但有更多的输入值评估为1.实际上,cos(n*2pi)=1
。这些函数有“反转”,但它们要么在某个范围内给出答案,要么给出多值答案。第三个例子是x²=1
。这对x=1
和x=-1
都是如此。但是,在这个例子中,你得到一个有限(也很小)的可能答案。
在处理加密时,可以说私钥用于选择正确的解决方案。您可以随时轻松地解密加密的邮件,但您将获得大量可能的答案。密钥用于找到正确的密钥,而不是实际解密。
琐碎的例子 - 说对于我们不可逆转的函数,我们取输入的数字并返回模7的值。
hash( 0) => 0
hash( 1) => 1
hash( 2) => 2
hash( 3) => 3
hash( 4) => 4
hash( 5) => 5
hash( 6) => 6
hash( 7) => 0
hash( 8) => 1
hash( 9) => 2
hash(10) => 3
hash(12) => 4
hash(13) => 5
hash(14) => 6
因此,如果哈希值为6,则不知道输入是6还是14,还是6 + 7 * N的任何值,其中N是整数。