区块链防篡改的“哈希算法”!

哈希算法是区块链中保证交易信息不被篡改的单向密码机制。哈希算法接收一段明文后,会以一种不可逆的方式将其转化为一段长度较短、位数固定的散列数据。

它有两个特点:

加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;

输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化。

在区块链中,通常使用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=B

2.B^2=C

3.取C中第2~4位数,组成一个3位数D

4.D/12的结果求余数,得到E

阿呆:我把E和上述计算方式都告诉你,你猜A是奇数还是偶数,然后我告诉你A是多少,你可以按上述的计算过程来验证我是否有说谎。

小星:嗯,我想想,假如阿呆你想的A为5,那么:

5+123=128

128^2=16384

D=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个重要的性质,即抗碰撞性、原像不可逆、难题友好性。碰撞性,就是指阿呆事先找出一奇一偶使得哈希结果一致,但这在计算上是不可行的。

首先,把大空间的消息压缩到小空间上,碰撞肯定是存在的。假设哈希值长度固定为256位,如果顺序取1,2,…2^256+1, 这2^256+1个输入值,逐一计算其哈希值,肯定能找到两个输入值使得其哈希值相同。但不要高兴的太早,因为你得有时间把它算出来,才是你的。

为什么这么说呢?

根据生日悖论,如果随机挑选其中的2^128+1输入,则有99.8%的概率发现至少一对碰撞输入。那么对于哈希值长度为256位的哈希函数,平均需要完成2^128次哈希计算,才能找到碰撞对。如果计算机每秒进行10000次哈希计算,需要约10^27年才能完成2^128次哈希计算。

所以,不要想着阿呆作弊了,因为估计也活不了这么久。当然如果计算机运算能力大幅提升,就有可能,这也是为什么说量子计算机对区块链有影响了。

那这个有什么用途呢?

用来验证信息的完整性,因为如果信息在传递过程中被篡改,那么运行哈希计算得到的哈希值与原来的哈希值不一样。在区块链中,哈希函数的抗碰撞性用来做区块和交易的完整性验证,一有篡改就能被识别出来。

部分文章来源:币乎(玩火的猴子)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180502A0JH2X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券