[Daozy]用于区块链的加密算法

哈希函数

一个函数可以接收一个或若干个输入值,然后经由函数的运算,产生一个输出值。哈希函数则是满足所有下列条件的一类函数:

  1. 接收任意长度的字符串作为输入;
  2. 产生固定长度的输出值;
  3. 计算时间在合理范围内。
    只要满足上述条件,一个函数就可以称之为哈希函数。举个简单的例子:取模运算。任意数字对10取模后得到的结果都是0~9之间的一个数字,那取模运算在这里就算是一个哈希函数。

加密哈希函数

目前用于比特币等数字货币的哈希函数则是加密哈希函数,加密哈希函数除了拥有上述哈希函数的三个特点外,还有着更为独特的特性。

1. 无碰撞性(collision free)

无碰撞性分为强无碰撞性和强无碰撞性。
强无碰撞性:对于一个哈希函数H, 我们无法找到两个不同的 x 和 y 值, 使得 H(x)=H(y)。
弱无碰撞性:对于一个哈希函数H以及输入x值,无法找到另外一个y 值, 使得 H(x)=H(y)。

2. 隐藏性

给定H(x), 无法推测出x的值。不仅无法推测出x的值,也不能推测出关于x的任何特点,比如奇偶性等。

3. 随机性

无论x值是否相近, 经过哈希运算后得出的H(x)都是完全随机的。这个特点就是说,哪怕输入值x的长度很长,同时另一个输入值x'和x值只有一个bit 的不同,那他们经由哈希函数H后得到的结果没有任何的相关性,就像输入了两个完全不同的x值一样。

哈希加密算法是基于“消息摘要”的算法,它拥有一个大家族,主要包括MD家族和SHA家族,MD主要包括MD2、MD4和MD5;SHA又包括SHA-0、SHA-1、SHA-2(主要包括224、256、384、512)和SHA-3。
这些算法当中最核心的是MD5和SHA-256。下面分别做讨论。

[Daozy]用于区块链的加密算法_第1张图片
image.png

MD5摘要算法

MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的散列算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 将数据(如汉字)运算为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5一度被广泛应用于安全领域。但是由于MD5的弱点被不断发现以及计算机能力不断的提升,现在已经可以构造两个具有相同 MD5的信息,使本算法不再适合当前的安全环境。目前,MD5计算广泛应用于错误检查。例如在一些BitTorrent下载中,软件通过计算MD5 和检验下载到的碎片的完整性。
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。


[Daozy]用于区块链的加密算法_第2张图片
image.png
MD5算法底层原理:

简单概括起来,MD5算法的过程分为四步:处理原文,设置初始值,循环加工,拼接结果。

  1. 处理原文

首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512N+448。
之后,用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。这样处理后的信息长度就是512
(N+1)。

  1. 设置初始值

MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下(16进制):
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210

  1. 循环加工

这一步是最复杂的一步,我们看看下面这张图,此图代表了单次A,B,C,D值演变的流程。


[Daozy]用于区块链的加密算法_第3张图片
image.png

图中,A,B,C,D就是哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环呢?由处理后的原文长度决定。

  1. 假设处理后的原文长度是M
  2. 主循环次数 = M / 512
  3. 每个主循环中包含 512 / 32 * 4 = 64 次 子循环。
    上面这张图所表达的就是单次子循环的流程。

下面对图中其他元素一一解释:
1.绿色F
图中的绿色F,代表非线性函数。官方MD5所用到的函数有四种:
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =XYZ
I(X, Y, Z)=Y^(X|(~Z))
在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。
2.红色“田”字
很简单,红色的田字代表相加的意思。
3.Mi
Mi是第一步处理后的原文。在第一步中,处理后原文的长度是512的整数倍。把原文的每512位再分成16等份,命名为M0M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M1M16之一。
4.Ki
一个常量,在64次子循环中,每一次用到的常量都是不同的。
5.黄色的<< 左移S位,S的值也是常量。
“流水线”的最后,让计算的结果和B相加,取代原先的B。新ABCD的产生可以归纳为:
新A = 原d
新B = b+((a+F(b,c,d)+Mj+Ki)<< 新C = 原b
新D = 原c
总结一下主循环中的64次子循环,可以归纳为下面的四部分:
第一轮:
FF(a,b,c,d,M0,7,0xd76aa478) s[0]=7, K[0] = 0xd76aa478
  FF(a,b,c,d,M1,12,0xe8c7b756) s[1]=12, K[1] = 0xe8c7b756
  FF(a,b,c,d,M2,17,0x242070db)
  FF(a,b,c,d,M3,22,0xc1bdceee)
  FF(a,b,c,d,M4,7,0xf57c0faf)
  FF(a,b,c,d,M5,12,0x4787c62a)
  FF(a,b,c,d,M6,17,0xa8304613)
  FF(a,b,c,d,M7,22,0xfd469501)
  FF(a,b,c,d,M8,7,0x698098d8)
  FF(a,b,c,d,M9,12,0x8b44f7af)
  FF(a,b,c,d,M10,17,0xffff5bb1)
  FF(a,b,c,d,M11,22,0x895cd7be)
  FF(a,b,c,d,M12,7,0x6b901122)
  FF(a,b,c,d,M13,12,0xfd987193)
  FF(a,b,c,d,M14,17, 0xa679438e)
  FF(a,b,c,d,M15,22,0x49b40821)
  第二轮:
  GG(a,b,c,d,M1,5,0xf61e2562)
  GG(a,b,c,d,M6,9,0xc040b340)
  GG(a,b,c,d,M11,14,0x265e5a51)
  GG(a,b,c,d,M0,20,0xe9b6c7aa)
  GG(a,b,c,d,M5,5,0xd62f105d)
  GG(a,b,c,d,M10,9,0x02441453)
  GG(a,b,c,d,M15,14,0xd8a1e681)
  GG(a,b,c,d,M4,20,0xe7d3fbc8)
  GG(a,b,c,d,M9,5,0x21e1cde6)
  GG(a,b,c,d,M14,9,0xc33707d6)
  GG(a,b,c,d,M3,14,0xf4d50d87)
  GG(a,b,c,d,M8,20,0x455a14ed)
  GG(a,b,c,d,M13,5,0xa9e3e905)
  GG(a,b,c,d,M2,9,0xfcefa3f8)
  GG(a,b,c,d,M7,14,0x676f02d9)
  GG(a,b,c,d,M12,20,0x8d2a4c8a)
  第三轮:
  HH(a,b,c,d,M5,4,0xfffa3942)
  HH(a,b,c,d,M8,11,0x8771f681)
  HH(a,b,c,d,M11,16,0x6d9d6122)
  HH(a,b,c,d,M14,23,0xfde5380c)
  HH(a,b,c,d,M1,4,0xa4beea44)
  HH(a,b,c,d,M4,11,0x4bdecfa9)
  HH(a,b,c,d,M7,16,0xf6bb4b60)
  HH(a,b,c,d,M10,23,0xbebfbc70)
  HH(a,b,c,d,M13,4,0x289b7ec6)
  HH(a,b,c,d,M0,11,0xeaa127fa)
  HH(a,b,c,d,M3,16,0xd4ef3085)
  HH(a,b,c,d,M6,23,0x04881d05)
  HH(a,b,c,d,M9,4,0xd9d4d039)
  HH(a,b,c,d,M12,11,0xe6db99e5)
  HH(a,b,c,d,M15,16,0x1fa27cf8)
  HH(a,b,c,d,M2,23,0xc4ac5665)
  第四轮:
  Ⅱ(a,b,c,d,M0,6,0xf4292244)
  Ⅱ(a,b,c,d,M7,10,0x432aff97)
  Ⅱ(a,b,c,d,M14,15,0xab9423a7)
  Ⅱ(a,b,c,d,M5,21,0xfc93a039)
  Ⅱ(a,b,c,d,M12,6,0x655b59c3)
  Ⅱ(a,b,c,d,M3,10,0x8f0ccc92)
  Ⅱ(a,b,c,d,M10,15,0xffeff47d)
  Ⅱ(a,b,c,d,M1,21,0x85845dd1)
  Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)
  Ⅱ(a,b,c,d,M15,10,0xfe2ce6e0)
  Ⅱ(a,b,c,d,M6,15,0xa3014314)
  Ⅱ(a,b,c,d,M13,21,0x4e0811a1)
  Ⅱ(a,b,c,d,M4,6,0xf7537e82)
  Ⅱ(a,b,c,d,M11,10,0xbd3af235)
  Ⅱ(a,b,c,d,M2,15,0x2ad7d2bb)
  Ⅱ(a,b,c,d,M9,21,0xeb86d391)

  1. 拼接结果
    这一步就很简单了,把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。

SHA256

比特币当中,想挖到矿容易吗?


[Daozy]用于区块链的加密算法_第4张图片
image.png

为什么以及是什么导致挖矿困难?我们先看下面这个要挖到块需要满足的公式:

SHA256(SHA256(版本号+前一区块哈希值+Merkle根哈希+时间戳+难度值+随机数))≤ 目标值

小括号内的是区块里面的信息,通过两次SHA256哈希算法,而且每次跳动都是巨变的。

https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA%3D%3D&chksm=f1feed21c68964375afea60d46bea99dc1ad7bf3ff047086c9a974230982791b44ae3f85e7b4&idx=1&mid=2650561442&scene=21&sn=0bbb6ea44e4b4feb6b3257a3dd0e2990

SHA-2是一系列SHA算法变体的总称,其中包含如下子版本:

l SHA-256:可以生成长度256bit的信息摘要。

l SHA-224:SHA-256的“阉割版”,可以生成长度224bit的信息摘要。

l SHA-512:可以生成长度512bit的信息摘要。

l SHA-384:SHA-512的“阉割版”,可以生成长度384bit的信息摘要。

显然,信息摘要越长,发生碰撞的几率就越低,破解的难度就越大。但同时,耗费的性能和占用的空间也就越高。

明文:abcd
MD5摘要:e2fc714c4727ee9395f324cd2e7f331f
SHA-256摘要:
88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589
合成摘要:
e2fc714c4727ee93209c897823b9217da3e161936f031589

有兴趣的朋友,请关注微信公众号,有机会获取平台代币:


[Daozy]用于区块链的加密算法_第5张图片
Daozy社区公众号

进入社区开发者群微信群,有机会获取平台代币:


[Daozy]用于区块链的加密算法_第6张图片
Daozy开发者群

进入社区贡献者微信群,有机会获取平台代币:


[Daozy]用于区块链的加密算法_第7张图片
Daozy社区贡献者群

你可能感兴趣的:([Daozy]用于区块链的加密算法)