【哈希算法】哈希算法hash 理解笔记--编辑中
哈希算法
有两个特点:
● 加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;
● 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化。
在区块链中,通常使用SHA-256(安全散列算法)进行区块加密,这种算法的输入长度为256位,输出的是一串长度为32字节的随机散列数据。
下面举个例子详细了解下
▌场景一、小星和阿呆在篮球场
小星:阿呆,你是不是口渴了,你要不要去买水喝,顺便帮我买一瓶哈。
阿呆:呵呵,你的小心思我还不知道,你自己也口渴了吧,你去,我不去。
小星:哎哎,咱们不扯这些没用的,来抛硬币,好不好,正面你去,反面我去,公平吧,如何?
阿呆:好吧。
………
▌场景二、小星与阿呆即时聊天中
阿呆:小星,今天来我家玩,来的路上,有一家披萨店,很好吃,顺便带一点哈。
小星:哦,要不你来我家玩吧,你顺便带上披萨。
阿呆:小星,你竟然都这么说了,看来只能抛硬币解决了。
小星:丫的,这个怎么抛,我怎么知道你有没有搞鬼。
阿呆:嗯,那到也是,要不这样。
1.考虑对结果加密
阿呆:我心中想一个数,假设为A,然后A在乘以一个数B,得到结果C。A是我的密钥,我把结果C告诉你。你来猜A是奇数还是偶数,猜中了,算你赢。
小星:这不行,如果你告诉我C是12,我猜A是奇数,你可以说A是4,B是3。我猜A是偶数,你可以说A是3,B是4。要不你告诉我C是多少的时候,也告诉我B是多少。
阿呆:那这不行,告诉你C和B,不等于告诉你A是多少了,还猜个屁。不行得换个方式。
2.不可逆加密
阿呆:小星,你看这样可以不,我想一个A,经过下面的过程:
1.A+123=B2.B^2=C3.取C中第2~4位数,组成一个3位数D4.D/12的结果求余数,得到E
1.A+123=B2.B^2=C3.取C中第2~4位数,组成一个3位数D4.D/12的结果求余数,得到E
阿呆:我把E和上述计算方式都告诉你,你猜A是奇数还是偶数,然后我告诉你A是多少,你可以按上述的计算过程来验证我是否有说谎。
小星:嗯,我想想,假如阿呆你想的A为5,那么:
5+123=128128^2=16384D=638 E=638mod12=53
5+123=128128^2=16384D=638 E=638mod12=53
(mod表示除法的求余数)
小星:咦,厉害了,一个A值对应一个唯一的E值,根据E还推算不出来A。你太贱了,好吧,这个算公平,谁撒谎都能被识别出来。
小星:阿呆,你出题吧 ……
这种丢掉一部分信息的加密方式称为“单向加密”,也叫哈希算法。
问题:阿呆有没有可能事先找出一奇一偶,按上述加密运算得到一样的结果呢?
答案:有可能的,如何解决这个问题呢?增加上述算法的难度,以至于阿呆很难找到。
3.哈希算法
1.对于给定的数据M,很容易算出哈希值X=F(M);
2.根据X很难反算出M;3.很难找到M和N使得F(N)=F(M)。
密码学中的哈希函数有3个重要的性质,
1即抗碰撞性、
2原像不可逆、
3难题友好性。
碰撞性,就是指阿呆事先找出一奇一偶使得哈希结果一致,但这在计算上是不可行的。
首先,把大空间的消息压缩到小空间上,碰撞肯定是存在的。假设哈希值长度固定为256位,如果顺序取1,2,…2^256+1, 这2^256+1个输入值,逐一计算其哈希值,肯定能找到两个输入值使得其哈希值相同。但不要高兴的太早,因为你得有时间把它算出来,才是你的。
为什么这么说呢?
根据生日悖论,如果随机挑选其中的2^128+1输入,则有99.8%的概率发现至少一对碰撞输入。那么对于哈希值长度为256位的哈希函数,平均需要完成2^128次哈希计算,才能找到碰撞对。如果计算机每秒进行10000次哈希计算,需要约10^27年才能完成2^128次哈希计算。
所以,不要想着阿呆作弊了,因为估计也活不了这么久。当然如果计算机运算能力大幅提升,就有可能,这也是为什么说量子计算机对区块链有影响了。
那这个有什么用途呢?
用来验证信息的完整性,因为如果信息在传递过程中被篡改,那么运行哈希计算得到的哈希值与原来的哈希值不一样。在区块链中,哈希函数的抗碰撞性用来做区块和交易的完整性验证,一有篡改就能被识别出来。
参考:《看完这些,你就彻底理解“哈希算法”了》https://m.sohu.com/a/237819117_100137451/?pvid=000115_3w_a