[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。下面分别做讨论。

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散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。
image.png

MD5算法底层原理:

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

首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512*N+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

  2. 循环加工

    这一步是最复杂的一步,我们看看下面这张图,此图代表了单次A,B,C,D值演变的流程。
    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) =X^Y^Z
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等份,命名为M0~M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M1~M16之一。
4.Ki
一个常量,在64次子循环中,每一次用到的常量都是不同的。
5.黄色的<<

SHA256

比特币当中,想挖到矿容易吗?
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社区公众号

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

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

猜你喜欢

转载自blog.csdn.net/tencupofkaiwater/article/details/80822205