精华内容
下载资源
问答
  • 【区块链】 区块链哈希算法

    千次阅读 2019-07-03 16:44:49
    哈希算法是什么 哈希算法区块链中保证交易信息不被篡改的单向密码机制。哈希算法接收一段明文后,以一种不可逆的方式将其转化为一段长度较短、位数固定的散列数据。它有两个特点: 加密过程不可逆,意味着我们...

    哈希算法是什么

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

    1. 加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;
    2. 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化。

    SHA–256(安全散列算法)

    在区块链中,通常使用SHA–256(安全散列算法)进行区块加密,这种算法的输入长度为256位,输出的是一串长度为32字节的随机散列数据。区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链的哈希值能够唯一而准确地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块中的信息没有被篡改。

    展开全文
  • 哈希是一种加密算法哈希函数(Hash Function),也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、...

    本文约9000字+,阅读(观看)需要52分钟

    聊到区块链的时候也少不了会听到“哈希”、“哈希函数”、“哈希算法”,是不是听得一头雾水?别急,这一讲我们来讲讲什么是哈希算法。

    哈希是一种加密算法

    哈希函数(Hash Function),也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、杂凑值或者消息摘要(Message Digest)。它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。

    它的函数表达式为:h=H(m)

    无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。以比特币使用的Sh256算法为例,无论输入是什么数据文件,输出就是256bit。

    每个bit就是一位0或者1,256bit就是256个0或者1二进制数字串,用16进制数字表示的话,就是多少位呢?

    16等于2的4次方,所以每一位16进制数字可以代表4位bit。那么,256位bit用16进制数字表示,当然是256除以4等于64位。

    于是你通常看到的哈希值,就是这样的了:

    00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。

    这是从btc.com上随便拷贝的一个哈希值,不放心的话你可以数一下,是不是64位~

    Hash函数的特点

    Hash函数具有如下特点。

    易压缩:对于任意大小的输入x,Hash值的长度很小,在实际应用中,函数H产生的Hash值其长度是固定的。

    易计算:对于任意给定的消息,计算其Hash值比较容易。单向性:对于给定的Hash值,要找到使得在计算上是不可行的,即求Hash的逆很困难。在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的。即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。抗碰撞性:理想的Hash函数是无碰撞的,但在实际算法的设计中很难做到这一点。有两种抗碰撞性:一种是弱抗碰撞性,即对于给定的消息,要发现另一个消息,满足在计算上是不可行的;另一种是强抗碰撞性,即对于任意一对不同的消息,使得在计算上也是不可行的。高灵敏性:这是从比特位角度出发的,指的是1比特位的输入变化会造成1/2的比特位发生变化。消息M的任何改变都会导致哈希值H(M)发生改变。即如果输入有微小不同,哈希运算后的输出一定不同。

    哈希算法

    把网址A,转换成数字1。网址B,转换成数字2。

    一个网址X,转换成数字N,根据数字N作为下标,就可以快速地查找出网址X的信息。这个转换的过程就是哈希算法。

    比如这里有一万首歌,给你一首新的歌X,要求你确认这首歌是否在那一万首歌之内。

    无疑,将一万首歌一个一个比对非常慢。但如果存在一种方式,能将一万首歌的每首数据浓缩到一个数字(称为哈希码)中,于是得到一万个数字,那么用同样的算法计算新的歌X的编码,看看歌X的编码是否在之前那一万个数字中,就能知道歌X是否在那一万首歌中。

    作为例子,如果要你组织那一万首歌,一个简单的哈希算法就是让歌曲所占硬盘的字节数作为哈希码。这样的话,你可以让一万首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字节数是否和已有的一万首歌中的某一首的字节数相同,就知道新的歌是否在那一万首歌之内了。

    一个可靠的哈希算法,应该满足:

    对于给定的数据M,很容易算出哈希值X=F(M);根据X很难反算出M;很难找到M和N使得F(N)=F(M)

    前面提到哈希函数具有抗碰撞性,碰撞性就是指有人实现找出一奇一偶使得哈希结果一致,但这在计算上是不可行的。

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

    根据生日悖论,如果随机挑选其中的2^128+1输入,则有99.8%的概率发现至少一对碰撞输入。那么对于哈希值长度为256位的哈希函数,平均需要完成2^128次哈希计算,才能找到碰撞对。如果计算机每秒进行10000次哈希计算,需要约10^27年才能完成2^128次哈希计算。在区块链中,哈希函数的抗碰撞性用来做区块和交易的完整性验证,一有篡改就能被识别出来。

    前面提到挖矿需要矿工通过随机数不断计算得到小于给定难度值的数值。难度值(difficulty)是矿工们挖矿时的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,为了让新区块的产生基本保持这个速率,难度值必须根据全网算力的变化进行调整。

    哈希函数通过调整难度值来确保每个区块挖出的时间都大约在10分钟,哈希函数计算的难度值对保证区块链系统的安全意义重大。正如美国的几位计算机科学家在共同所著的书中所写的:“哈希密码是密码学中的瑞士军刀,它们在众多各具特色的应用中找到了一席之地,为了保证安全,不同的应用会要求不同的哈希函数特点。事实已经证明,要确定一系列哈希函数以全面达成可证安全极度困难。”

    工作量证明需要有一个目标值。比特币工作量证明的目标值(target)的计算公式如下:

    目标值=最大目标值 / 难度值

    其中,最大目标值为一个恒定值:

    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

    我们也可以简单理解成,比特币工作量证明的过程,就是通过不停地变换区块头(即尝试不同的随机值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。

    举个栗子帮助理解

    ▌场景一、小星和阿呆在篮球场

    小星:阿呆,你是不是口渴了,你要不要去买水喝,顺便帮我买一瓶哈。

    阿呆:呵呵,你的小心思我还不知道,你自己也口渴了吧,你去,我不去。

    小星:哎哎,咱们不扯这些没用的,来抛硬币,好不好,正面你去,反面我去,公平吧,如何?

    阿呆:好吧。

    ………

    ▌场景二、小星与阿呆即时聊天中

    阿呆:小星,今天来我家玩,来的路上,有一家披萨店,很好吃,顺便带一点哈。

    小星:哦,要不你来我家玩吧,你顺便带上披萨。

    阿呆:小星,你竟然都这么说了,看来只能抛硬币解决了。

    小星:丫的,这个怎么抛,我怎么知道你有没有搞鬼。

    阿呆:嗯,那到也是,要不这样。

    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

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

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

    5+123=128128^2=16384D=638 E=638mod12=53

    (mod表示除法的求余数)

    小星:咦,厉害了,一个A值对应一个唯一的E值,根据E还推算不出来A。你太贱了,好吧,这个算公平,谁撒谎都能被识别出来。

    小星:阿呆,你出题吧 ……

    这种丢掉一部分信息的加密方式称为“单向加密”,也叫哈希算法。

    常见的哈希算法

    1SHA-1算法

    SHA-1的输入是最大长度小于264位的消息,输入消息以512位的分组为单位进行处理,输出是160位的消息摘要。SHA-1具有实现速度高、容易实现、应用范围广等优点,其算法描述如下。

    对输入的消息进行填充:经过填充后,消息的长度模512应与448同余。填充的方式为第一位是1,余下各位都为0。再将消息被填充前的长度以big-endian的方式附加在上一步留下的最后64位中。该步骤是必须的,即使消息的长度已经是所希望的长度。填充的长度范围是1到512。

    初始化缓冲区:可以用160位来存放Hash函数的初始变量、中间摘要及最终摘要,但首先必须进行初始化,对每个32位的初始变量赋值,即:

    进入消息处理主循环,处理消息块:一次处理512位的消息块,总共进行4轮处理,每轮进行20次操作,如图所示。这4轮处理具有类似的结构,但每轮所使用的辅助函数和常数都各不相同。每轮的输入均为当前处理的消息分组和缓冲区的当前值A、B、C、D、E,输出仍放在缓冲区以替代旧的A、B、C、D、E的值。第四轮的输出再与第一轮的输入CVq相加,以产生CVq+1,其中加法是缓冲区5个字CVq中的每个字与中相应的字模232相加。

    图 单个512位消息块的处理流程

    输出:所有的消息分组都被处理完之后,最后一个分组的输出即为得到的消息摘要值。

    SHA-1的步函数如图所示,它是SHA-1最为重要的函数,也是SHA-1中最关键的部件。

    图 SHA-1的步函数

    SHA-1每运行一次步函数,A、B、C、D的值就会依次赋值给B、C、D、E这几个寄存器。同时,A、B、C、D、E的输入值、常数和子消息块在经过步函数运算后就会赋值给A。

    其中,t是步数,0≤t≤79,Wt是由当前512位长的分组导出的一个32位的字,Kt是加法常量。

    基本逻辑函数f的输入是3个32位的字,输出是一个32位的字,其函数表示如下。

    对于每个输入分组导出的消息分组wt,前16个消息字wt(0≤t≤15)即为消息输入分组对应的16个32位字,其余wt(0≤t≤79)可按如下公式得到:

    其中,ROTLs表示左循环移位s位,如图所示。

    图 SHA-1的80个消息字的产生过程

    2SHA-2算法

    SHA-2系列Hash算法,其输出长度可取SHA-2系列哈希算法的输出长度可取224位、256位、384位、512位,分别对应SHA-224、SHA-256、SHA-384、SHA-512。它还包含另外两个算法:SHA-512/224、SHA-512/256。比之前的Hash算法具有更强的安全强度和更灵活的输出长度,其中SHA-256是常用的算法。下面将对前四种算法进行简单描述。

    SHA-256算法

    SHA-256算法的输入是最大长度小于264位的消息,输出是256位的消息摘要,输入消息以512位的分组为单位进行处理。算法描述如下。

    (1)消息的填充

    添加一个“1”和若干个“0”使其长度模512与448同余。在消息后附加64位的长度块,其值为填充前消息的长度。从而产生长度为512整数倍的消息分组,填充后消息的长度最多为264位。

    (2)初始化链接变量

    链接变量的中间结果和最终结果存储于256位的缓冲区中,缓冲区用8个32位的寄存器A、B、C、D、E、F、G和H表示,输出仍放在缓冲区以代替旧的A、B、C、D、E、F、G、H。首先要对链接变量进行初始化,初始链接变量存储于8个寄存器A、B、C、D、E、F、G和H中:

    初始链接变量是取自前8个素数(2、3、5、7、11、13、17、19)的平方根的小数部分其二进制表示的前32位。

    (3)处理主循环模块

    消息块是以512位分组为单位进行处理的,要进行64步循环操作(如图所示)。每一轮的输入均为当前处理的消息分组和得到的上一轮输出的256位缓冲区A、B、C、D、E、F、G、H的值。每一步中均采用了不同的消息字和常数,下面将给出它们的获取方法。

    图 SHA-256的压缩函数

    (4)得出最终的Hash值

    所有512位的消息块分组都处理完以后,最后一个分组处理后得到的结果即为最终输出的256位的消息摘要。

    步函数是SHA-256中最为重要的函数,也是SHA-256中最关键的部件。其运算过程如图所示。

    图 SHA-256的步函数

    根据T1、T2的值,对寄存器A、E进行更新。A、B、C、E、F、G的输入值则依次赋值给B、C、D、F、G、H。

    Kt的获取方法是取前64个素数(2,3,5,7,……)立方根的小数部分,将其转换为二进制,然后取这64个数的前64位作为Kt。其作用是提供了64位随机串集合以消除输入数据里的任何规则性。

    对于每个输入分组导出的消息分组Wt,前16个消息字Wt(0≤t≤15)直接按照消息输入分组对应的16个32位字,其他的则按照如下公式来计算得出:

    图 SHA-256的64个消息字的生成过程

    SHA-512算法

    SHA-512是SHA-2中安全性能较高的算法,主要由明文填充、消息扩展函数变换和随机数变换等部分组成,初始值和中间计算结果由8个64位的移位寄存器组成。该算法允许输入的最大长度是2128位,并产生一个512位的消息摘要,输入消息被分成若干个1024位的块进行处理,具体参数为:消息摘要长度为512位;消息长度小于2128位;消息块大小为1024位;消息字大小为64位;步骤数为80步。下图显示了处理消息、输出消息摘要的整个过程,该过程的具体步骤如下。

    图 SHA-512的整体结构

    消息填充:填充一个“1”和若干个“0”,使其长度模1024与896同余,填充位数为0-1023,填充前消息的长度以一个128位的字段附加到填充消息的后面,其值为填充前消息的长度。

    链接变量初始化:链接变量的中间结果和最终结果都存储于512位的缓冲区中,缓冲区用8个64位的寄存器A、B、C、D、E、F、G、H表示。初始链接变量也存储于8个寄存器A、B、C、D、E、F、G、H中,其值为:

    初始链接变量采用big-endian方式存储,即字的最高有效字节存储于低地址位置。初始链接变量取自前8个素数的平方根的小数部分其二进制表示的前64位。

    主循环操作:以1024位的分组为单位对消息进行处理,要进行80步循环操作。每一次迭代都把512位缓冲区的值A、B、C、D、E、F、G、H作为输入,其值取自上一次迭代压缩的计算结果,每一步计算中均采用了不同的消息字和常数。计算最终的Hash值:消息的所有N个1024位的分组都处理完毕之后,第N次迭代压缩输出的512位链接变量即为最终的Hash值。

    步函数是SHA-512中最关键的部件,其运算过程类似SHA-256。每一步的计算方程如下所示,B、C、D、F、G、H的更新值分别是A、B、C、E、F、G的输入状态值,同时生成两个临时变量用于更新A、E寄存器。

    对于80步操作中的每一步t,使用一个64位的消息字Wt,其值由当前被处理的1024位消息分组Mi导出,导出方法如图所示。前16个消息字Wt(0≤t≤15)分别对应消息输入分组之后的16个32位字,其他的则按照如下公式来计算得出:

    图 SHA-512的80个消息字生成的过程

    其中,

    式中,ROTRn(X)表示对64位的变量x循环右移n位,SHRn(X)表示对64位的变量x右移n位。

    从图可以看出,在前16步处理中,Wt的值等于消息分组中相对应的64位字,而余下的64步操作中,其值是由前面的4个值计算得到的,4个值中的两个要进行移位和循环移位操作。

    Kt的获取方法是取前80个素数(2,3,5,7,……)立方根的小数部分,将其转换为二进制,然后取这80个数的前64位作为Kt,其作用是提供了64位随机串集合以消除输入数据里的任何规则性。

    SHA-224与SHA-384

    SHA-256和SHA-512是很新的Hash函数,前者定义一个字为32位,后者则定义一个字为64位。实际上二者的结构是相同的,只是在循环运行的次数、使用常数上有所差异。SHA-224及SHA-384则是前述两种Hash函数的截短型,它们利用不同的初始值做计算。

    SHA-224的输入消息长度跟SHA-256的也相同,也是小于264位,其分组的大小也是512位,其处理流程跟SHA-256也基本一致,但是存在如下两个不同的地方。

    SHA-224的消息摘要取自A、B、C、D、E、F、G共7个寄存器的比特字,而SHA-256的消息摘要取自A、B、C、D、E、F、G、H共8个寄存器的32比特字。SHA-224的初始链接变量与SHA-256的初始链接变量不同,它采用高端格式存储,但其初始链接变量的获取方法是取前第9至16个素数(23、29、31、37、41、43、47、53)的平方根的小数部分其二进制表示的第二个32位,SHA-224的初始链接变量如下:

    SHA-224的详细计算步骤与SHA-256一致。

    SHA-384的输入消息长度跟SHA-512相同,也是小于2128位,而且其分组的大小也是1024位,处理流程跟SHA-512也基本一致,但是也有如下两处不同的地方。

    SHA-384的384位的消息摘要取自A、B、C、D、E、F共6个64比特字,而SHA-512的消息摘要取自A、B、C、D、E、F、G、H共8个64比特字。SHA-384的初始链接变量与SHA-512的初始链接变量不同,它也采用高端格式存储,但其初始链接变量的获取方法是取前9至16个素数(23、29、31、37、41、43、47、53)的平方根的小数部分其二进制表示的前64位,SHA-384的初始链接变量如下:

    SHA-384的详细计算步骤与SHA-512的相同。

    3SHA-3算法

    SHA-3算法整体采用Sponge结构,分为吸收和榨取两个阶段。SHA-3的核心置换f作用在5×5×64的三维矩阵上。整个f共有24轮,每轮包括5个环节θ、ρ、π、χ、τ。算法的5个环节分别作用于三维矩阵的不同维度之上。θ环节是作用在列上的线性运算;ρ环节是作用在每一道上的线性运算,将每一道上的64比特进行循环移位操作;π环节是将每道上的元素整体移到另一道上的线性运算;χ环节是作用在每一行上的非线性运算,相当于将每一行上的5比特替换为另一个5比特;τ环节是加常数环节。

    目前,公开文献对SHA-3算法的安全性分析主要是从以下几个方面来展开的。

    对SHA-3算法的碰撞攻击、原像攻击和第二原像攻击。对SHA-3算法核心置换的分析,这类分析主要针对算法置换与随机置换的区分来展开。对SHA-3算法的差分特性进行展开,主要研究的是SHA-3置换的高概率差分链,并构筑差分区分器。

    Keccak算法的立体加密思想和海绵结构,使SHA-3优于SHA-2,甚至AES。Sponge函数可建立从任意长度输入到任意长度输出的映射。

    4RIPEMD160算法

    RIPEMD(RACE Integrity Primitives Evaluation Message Digest),即RACE原始完整性校验消息摘要。RIPEMD使用MD4的设计原理,并针对MD4的算法缺陷进行改进,1996年首次发布RIPEMD-128版本,它在性能上与SHA-1相类似。

    RIPEMD-160是对RIPEMD-128的改进,并且是RIPEMD中最常见的版本。RIPEMD-160输出160位的Hash值,对160位Hash函数的暴力碰撞搜索攻击需要280次计算,其计算强度大大提高。RIPEMD-160的设计充分吸取了MD4、MD5、RIPEMD-128的一些性能,使其具有更好的抗强碰撞能力。它旨在替代128位Hash函数MD4、MD5和RIPEMD。

    RIPEMD-160使用160位的缓存区来存放算法的中间结果和最终的Hash值。这个缓存区由5个32位的寄存器A、B、C、D、E构成。寄存器的初始值如下所示:

    数据存储时采用低位字节存放在低地址上的形式。

    处理算法的核心是一个有10个循环的压缩函数模块,其中每个循环由16个处理步骤组成。在每个循环中使用不同的原始逻辑函数,算法的处理分为两种不同的情况,在这两种情况下,分别以相反的顺序使用5个原始逻辑函数。每一个循环都以当前分组的消息字和160位的缓存值A、B、C、D、E为输入得到新的值。每个循环使用一个额外的常数,在最后一个循环结束后,两种情况的计算结果A、B、C、D、E和A′、B′、C′、D′、E′及链接变量的初始值经过一次相加运算产生最终的输出。对所有的512位的分组处理完成之后,最终产生的160位输出即为消息摘要。

    除了128位和160位的版本之外,RIPEMD算法也存在256位和320位的版本,它们共同构成RIPEMD家族的四个成员:RIPEMD-128、RIPEMD-160、RIPEMD-256、RIPEMD-320。其中128位版本的安全性已经受到质疑,256位和320位版本减少了意外碰撞的可能性,但是相比于RIPEMD-128和RIPEMD-160,它们不具有较高水平的安全性,因为他们只是在128位和160位的基础上,修改了初始参数和s-box来达到输出为256位和320位的目的。

    文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。

    来源:区块链社区HiBlock


    展开全文
  • 众所周知,想做区块链呢,对加密方式,加密算法什么的了解是必不可少的,毕竟区块链通俗的讲就是分布式数据库+共识+密码学,常见的密码学有三种: 散列函数(也称哈希函数)算法 对称加密算法 非对称加密...

    众所周知,想做区块链呢,对加密方式,加密算法什么的了解是必不可少的,毕竟区块链通俗的讲就是分布式数据库+共识+密码学,常见的密码学有三种:

    • 散列函数(也称哈希函数)算法

    • 对称加密算法

    • 非对称加密算法
       

    散列函数算法的代表有:MD5,SHA等

    对称加密算法的代表有:DES,3DES,AES等

    非对称加密算法的代表有:RSA,DSA,ECC等

    在本章里,啊,我们会学习用各种编程语言实现不同的加密算法,比如go啊,c++啊等等的

    好了就这样,开始我们的第一个加密算法吧=。=

    展开全文
  • 为了为保证存储于区块链中的信息的安全与完整,区块链中... 在前边的文章中已经系统的讲述了密码学中的哈希算法,在本节,将会给大家介绍Hash算法区块链中的应用! 概念回顾:  哈希函数:是一类数学函数,可...

      为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户。

      在前边的文章中已经系统的讲述了密码学中的哈希算法,在本节,将会给大家介绍Hash算法在区块链中的应用!

     


    概念回顾

      哈希函数:是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称为散列值。

      以哈希函数为基础构造的哈希算法,在现代密码学中扮演着重要的角色,常用于实现数据完整性和实体认证,同时也构成多种密码体制和协议的安全保障。

      碰撞是与哈希函数相关的重要概念,体现着哈希函数的安全性,所谓碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值。

      哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。

     


    区块链中的加密算法······即将开始

            噔噔、噔···噔···!


     比特币中的加密算法:

      在比特币系统中使用了两个密码学Hash函数,一个是SHA256 RIPEMD160

    其中:RIPEMD160主要用于生成比特币地址,我们着重分析比特币中用得最多的SHA256算法。

      

    SHA历史介绍:    
        SHA256属于著名的SHA家族一员。SHA(Secure Hash Algorithm,安全哈希算法)是一类由美国国家标准与技术研究院(NIST)发布的密码哈希函数。
    正式名称为SHA的第一个成员发布于1993年,两年之后,著名的SHA
    -1发布,之后另外的4种变体相继发布,包括SHA224、SHA256、SHA384和SHA512,这些
    算法也被称作SHA2。SHA256算法是SHA2算法簇中的一类。对于长度小于264位的消息,SHA256会产生一个256位的消息摘要。SHA256具有密码哈希函数的一般特性。

      

      那么比特币中的SHA256又是何方神圣?它的设计原理是什么?代码又如何实现呢?

                下面让我娓娓道来·····


      SHA256又是何方神圣?

      SHA256是构造区块链所用的主要密码哈希函数。无论是区块的头部信息还是交易数据,都使用这个哈希函数去计算相关数据的哈希值,以保证数据的完整性。同时,在比特币系统中,基于寻找给定前缀的SHA256哈希值,设计了工作量证明的共识机制;SHA256也被用于构造比特币地址,即用来识别不同的用户。 

      SHA256是一个Merkle-Damgard结构的迭代哈希函数,其计算过程分为两个阶段:消息的预处理和主循环。在消息的预处理阶段,主要完成消息的填充和扩展填充,将所输入的原始消息转化为n个512比特的消息块,之后对每个消息块利用SHA256压缩函数进行处理。这个计算流程是一个迭代计算的过程,当最后1个消息块(第n块)处理完毕以后,最终的输出值就是所输入的原始消息的SHA256值。

      在比特币系统中,SHA256算法的一个主要用途是完成PoW(工作量证明)计算。按照比特币的设计初衷,PoW要求钱包(节点)数和算力值大致匹配,因为需要通过CPU的计算能力来进行投票。然而随着人们对SHA256的计算由CPU逐渐升级到GPU,到FPGA,直至到ASIC矿机,这使得节点数和PoW算力也渐渐失配。解决这个问题的一个思路是引入另外的一些哈希函数来实现PoW。

      scrypt算法最早用于基于口令的密钥生成,该算法进行多次带参数的SHA256计算,即基于SHA256的消息认证码计算,这类计算需要大量的内存支持。采用scrypt算法进行PoW计算,将PoW计算由已有的拼算力在一定程度上转化为拼内存,能够使得节点数和PoW的计算力的失配现象得到缓解。莱特币就是采用scrypt算法完成PoW计算的。

      SHA3算法是2012年10月由NIST所选定的下一代密码哈希算法。在遴选SHA3算法过程中人们提出了一系列的候选算法,包括了BLAKE、Grostl、JH、Keccak、Skein、ECHO、Luffa、BMW、CubeHash、SHAvite、SMID等,最后胜出的是Keccak算法。达世币(DASH,原名暗黑币,DarkCoin)定义了顺序调用上述11个哈希算法的X11算法,并利用这个算法完成PoW计算。同样,由于采用了X11算法,使得节点数和PoW的计算力能够保持一定程度上的匹配。

    设计原理

      下面介绍SHA算法计算消息摘要的原理:

      对于任意长度(按bit计算)的消息,SHA256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。

      SHA算法有如下特性: 
      1. 不可以从消息摘要中复原信息; 
      2. 两个不同的消息不会产生同样的消息摘要。

      一、术语和概念

      (一)位(Bit),字节(Byte)和字(Word)

      SHA始终把消息当成一个位(bit)字符串来处理。本文中,一个“字”(Word)是32位,而一个“字节”(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串:0x616263.

       二、SHA256算法描述

      (一)补位

      信息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)Q2 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。

      补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。以信息“abc”为例显示补位的过程。 
       
      原始信息:01100001 01100010 01100011

      补位第一步:0110000101100010 01100011 1

      首先补一个“1”

      补位第二步:0110000101100010 01100011 10…..0

      然后补423个“0”

      我们可以把最后补位完成后的数据用16进制写成下面的样子 
      

      61626380 0000000000000000 00000000
    
      00000000 0000000000000000 00000000
    
      00000000 0000000000000000 00000000
    
      00000000 00000000

      现在,数据的长度是448了,我们可以进行下一步操作。

      (二)补长度

      所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式) 
      

      61626380 0000000000000000 00000000
      00000000 0000000000000000 00000000
    
      00000000 0000000000000000 00000000
    
      00000000 0000000000000000 00000018

      (三)使用的常量

      在SHA256算法中,用到64个常量,这些常量是对自然数中前64个质数的立方根的小数部分取前32bit而来。这64个常量如下:

           428a2f98 71374491 b5c0fbcf e9b5dba5 
            3956c25b 59f111f1 923f82a4 ab1c5ed5 
            d807aa98 12835b01 243185be 550c7dc3 
            72be5d74 80deb1fe 9bdc06a7 c19bf174 
            e49b69c1 efbe4786 0fc19dc6 240ca1cc 
            2de92c6f 4a7484aa 5cb0a9dc 76f988da 
            983e5152 a831c66d b00327c8 bf597fc7 
            c6e00bf3 d5a79147 06ca6351 14292967 
            27b70a85 2e1b2138 4d2c6dfc 53380d13 
            650a7354 766a0abb 81c2c92e 92722c85 
            a2bfe8a1 a81a664b c24b8b70 c76c51a3 
            d192e819 d6990624 f40e3585 106aa070 
            19a4c116 1e376c08 2748774c 34b0bcb5  
            391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3 
            748f82ee 78a5636f 84c87814 8cc70208 
            90befffa a4506ceb bef9a3f7 c67178f2

       该算法使用了六种基本逻辑函数,由64 步迭代运算组成。每步都以256-bit 缓存值ABCDEFGH 为输入,然后更新缓存内容。 
      每步使用一个32bit 常数值Kt 和一个32bit Wt。 

      (四)六种基本逻辑函数 

            CH(x, y, z) = (x AND y) XOR ( (NOT x) AND z)  
            MAJ( x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)  
            BSIG0(x) = ROTR^2(x) XOR ROTR^13(x) XOR ROTR^22(x)  
            BSIG1(x) = ROTR^6(x) XOR ROTR^11(x) XOR ROTR^25(x)  
            SSIG0(x) = ROTR^7(x) XOR ROTR^18(x) XOR SHR^3(x)  
            SSIG1(x) = ROTR^17(x) XOR ROTR^19(x) XOR SHR^10(x) 

      其中 x、y、z皆为32bit的字。 
      ROTR^2(x)是对x进行循环右移2位。

      运算逻辑,如图所示:

     

      (五)计算消息摘要

      基本思想:就是将消息分成N个512bit的数据块,哈希初值H(0)经过第一个数据块得到H(1),H(1)经过第二个数据块得到H(2),……,依次处理,最后得到H(N),然后将H(N)的8个32bit连接成256bit消息摘要。

      I、哈希初值H(0)

      SHA256算法中用到的哈希初值H(0)如下

         H(0)0 = 6a09e667 
            H(0)1 = bb67ae85  
            H(0)2 = 3c6ef372 
            H(0)3 = a54ff53a 
            H(0)4 = 510e527f 
            H(0)5 = 9b05688c 
            H(0)6 = 1f83d9ab 
            H(0)7 = 5be0cd19

      注:这些初值是对自然数中前8个质数3、5、7、11等的平方根的小数部分取前32bit而来。

    II、 计算过程中用到的三种中间值

        1、64个32bit字的message schedule标记为w0、w1、…、w63。
        2、8个32bit字的工作变量标记为a、b、c、d、e、f、g。
        3、包括8个32bit字的哈希值标记为H(i)0、…、H(i)7

    III、 工作流程

      原始消息分为N个512bit的消息块。每个消息块分成16个32bit的字标记为M(i)0、M(i)1、M(i)2、…、M(i)15然后对这N个消息块依次进行如下处理

                For i=1 to N
            1)   For t = 0 to 15 
                         Wt = M(i)t 
                     For t = 16 to 63 
    
                         Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(t-15) + W(t-16) 
             2)  a = H(i-1)0 
                    b = H(i-1)1 
                    c = H(i-1)2 
                    d = H(i-1)3 
                    e = H(i-1)4 
                    f = H(i-1)5 
                    g = H(i-1)6 
                    h = H(i-1)7
             3)For t = 0 to 63 
                        T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt 
                        T2 = BSIG0(a) + MAJ(a,b,c) 
                        h = g
                        g = f 
                        f = e 
                        e = d + T1 
                        d = c 
                        c = b 
                        b = a 
                        a = T1 + T2
    
               4)H(i)0 = a + H(i-1)0 
                     H(i)1 = b + H(i-1)1 
                     H(i)2 = c + H(i-1)2 
                     H(i)3 = d + H(i-1)3 
                     H(i)4 = e + H(i-1)4 
                     H(i)5 = f + H(i-1)5  
                     H(i)6 = g + H(i-1)6 
                     H(i)7 = h + H(i-1)7

      对N个消息块依次进行以上四步操作后将最后得到的H(N)0、H(N)1、H(N)2、…、H(N)7串联起来即可得到最后的256bit消息摘要。

     代码实现

    I 调用库函数:

      下面的示例计算 data 的SHA256哈希值,并将它存储在 result 中。此示例假定存在一个预定义的常数 DATA_SIZE:

      C#的代码示例:
    1 byte[] result;
    2 byte[] data = new byte[DATA_SIZE];
    3 SHA256 shaM = new SHA256Managed();
    4 result  = shaM.ComputeHash(data);
      Java的代码示例:
    1 ubyteresult[];
    2 ubyte data[] = new ubyte[DATA_SIZE];
    3 SHA256 shaM  = new SHA256Managed();
    4 result  = shaM.ComputeHash(data);
      SQL的代码示例:
    1 SELECT sha2(data,256);
      PHP的代码示例:
    1 $result=hash('sha256', $data);

    II 自己编写代码实现

     

      前面我们已经说明了SHA-256的计算过程,接下来我们将这一过程代码化。同样的首先定义一个上下文的结构。

     

    复制代码
     1 /** 定义SHA-256哈希操作的内容信息结构体 */
     2 typedef struct SHA256Context {
     3   uint32_t Intermediate_Hash[SHA256HashSize/4]; /* 信息摘要 */
     4   uint32_t Length_High;                         /* 按位计算的信息长度高字 */
     5   uint32_t Length_Low;                          /* 按位计算的信息长度低字 */
     6   int_least16_t Message_Block_Index;            /* 信息分组数组的索引 */
     7   uint8_t Message_Block[SHA256_Message_Block_Size];/* 512位信息分组 */
     8   int Computed;                                 /* 摘要计算标识 */
     9   int Corrupted;                                /* 信息摘要损坏标识 */
    10 } SHA256Context;
    复制代码

     

      实现SHA256Context结构的初始化,为后续的计算过程做准备。

     

    复制代码
     1 static SHAStatusCode SHA224_256Reset(SHA256Context *context, uint32_t *H0)
     2 {
     3   if (!context) return shaNull;
     4   context->Length_High = context->Length_Low = 0;
     5   context->Message_Block_Index = 0;
     6   context->Intermediate_Hash[0] = H0[0];
     7   context->Intermediate_Hash[1] = H0[1];
     8   context->Intermediate_Hash[2] = H0[2];
     9   context->Intermediate_Hash[3] = H0[3];
    10   context->Intermediate_Hash[4] = H0[4];
    11   context->Intermediate_Hash[5] = H0[5];
    12   context->Intermediate_Hash[6] = H0[6];
    13   context->Intermediate_Hash[7] = H0[7];
    14   context->Computed = 0;
    15   context->Corrupted = shaSuccess;
    16   return shaSuccess;
    17 }
    复制代码

     

      接下来实现信息分组的输入,这个函数接受一个字节数组作为下一个消息分组以便进行处理。

     

    复制代码
     1 SHAStatusCode SHA256Input(SHA256Context *context, const uint8_t *message_array,unsigned int length)
     2 {
     3   if (!context) return shaNull;
     4   if (!length) return shaSuccess;
     5   if (!message_array) return shaNull;
     6   if (context->Computed) return context->Corrupted = shaStateError;
     7   if (context->Corrupted) return context->Corrupted;
     8   while (length--)
     9   {
    10     context->Message_Block[context->Message_Block_Index++] =*message_array;
    11     if ((SHA224_256AddLength(context, 8) == shaSuccess) &&(context->Message_Block_Index == SHA256_Message_Block_Size))
    12       SHA224_256ProcessMessageBlock(context);
    13     message_array++;
    14   }
    15   return context->Corrupted;
    16 }
    复制代码

     

      当然还需要一个消息处理及最终摘要输出的函数,这个函数将返回一个224位或者256位的信息摘要到调用者给定的Message_Digest数组。返回的信息摘要,第一个元素索引为0,最后一个元素索引为27(SHA-2244)或者31(SHA-256)。

     

    复制代码
     1 static SHAStatusCode SHA224_256ResultN(SHA256Context *context,uint8_t Message_Digest[ ], int HashSize)
     2 {
     3   int i;
     4   if (!context) return shaNull;
     5   if (!Message_Digest) return shaNull;
     6   if (context->Corrupted) return context->Corrupted;
     7   if (!context->Computed)
     8     SHA224_256Finalize(context, 0x80);
     9   for (i = 0; i < HashSize; ++i)
    10     Message_Digest[i] = (uint8_t)(context->Intermediate_Hash[i>>2] >> 8 * ( 3 - ( i & 0x03 ) ));
    11   return shaSuccess;
    12 }
    复制代码

     


     

    区块链中的哈希指针链

      哈希指针是一类数据结构,除了包含通常的指针外,还包含一些数据信息以及与这些信息相关的密码哈希值,这就使得正常的指针可用于取回信息,哈希指针用于验证信息是否发生改变。区块链就可以看作一类使用哈希指针的链表,如下图所示。这个链表链接一系列的区块,每个区块包含数据以及指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告诉前一个区块的位置,也提供一个哈希值去验证这个区块所包含的数据是否发生改变。

     

    哈希指针链

      可以利用区块链去构造一个防篡改的日志系统。在这个系统中,基于区块链的日志节点链表被用来存储数据,链表节点通过哈希指针链接,新节点追加在日志链表的尾部。同时,日志链表的头哈希指针所指向的头节点内容不可改变。若日志链表中的某个节点的数据被篡改,则系统能够检测出来。

      假定攻击者改变了节点k的数据,由于其后继节点k+1存储了节点k的哈希值,由于密码哈希函数的抗碰撞性,通过简单地计算节点k的数据的哈希值,就能发现计算出的值与节点k+1的哈希指针值不一致,于是可以断定节点k或节点k+1的信息被篡改。当然,攻击者可能能够连续改变前一个节点的哈希值来掩盖不同,但这个策略在处理日志链表的头节点时将会失败。特别地,一旦将链表头部的哈希指针存储在不能改变的地方,攻击者将不能改变任何节点而不被发觉。

      因此,若攻击者想在日志链表中的任意位置改变数据,为保持一致性,他必须向表头方向修改所有的哈希指针,最终由于不能改变链表头部而失败。因此,只需单个哈希指针,基本上就能保证整个链表的哈希值的一致性,从而达到防篡改的目的。

     


     

            哈哈哈哈哈哈,区块链中加密算法——Hash算法之SHA256算法 到这里就更新完了!

                 下一节给大家讲Merkle树敬请期待·····

     


     

    【时间仓促,如有错误,欢迎指正! ||   欢迎留下您的评语!  大家一起探讨、学习区块链!】 

    【转载请注明出处!http://www.cnblogs.com/X-knight/

     


     

     

     

    Reference:

      1.SHA256代码实现:https://www.cnblogs.com/foxclever/p/8370712.html

      2.SHA256算法介绍:https://blog.csdn.net/wowotuo/article/details/78907380

      3.《区块链技术指南》邹均张海宁唐屹李磊 著

     

    展开全文
  • 区块链采用密码学的方法来保证已有数据不可能被...(2)非对称加密;两个都是密码学的基础概念,网上都有非常清晰的定义,我只简单说下:(密码学)哈希函数:一个函数Y=H(X),有如下性质:1)有X可以很容易算出Y;2...
  • 哈希函数 一个函数可以接收一个或若干个输入值,然后经由函数的运算,产生一个输出值。哈希函数则是满足所有下列条件的一类函数: 1. 接收任意长度的字符串作为输入; 2. 产生固定长度的输出值; 3. 计算时间在...
  • 摘要就是我们说的哈希值,签名是加密后的摘要 区块链中所谓的大多数节点其实往往指的是算力的大多数。首先账户的大多数并不具备太大的意义,因为如果向攻击区块链,我申请无限个私钥,那就是无限个账户,没意义,...
  • 大家都知道,区块链的关键技术组成主要为:P2P网络协议、共识机制、密码学技术、账户与存储模型。...那么今天我们来详细的聊一...- 非对称加密算法 一、区块链中的哈希算法 哈希算法是区块链中用的最多的一种算法,它...
  • 区块链中的哈希算法

    2018-12-04 13:31:57
    密码学在区块链中的应用主要有两个:哈希算法与非对称加密算法。这次主要对哈希算法进行详细的说明。 哈希算法 哈希算法的特点有: 1、输入可以为任意大小的字符串; 2、产生固定大小的输出; 3、可以在合理的时间内...
  • 上篇我们大概认识了哈希,对称和非对称加密算法,混合加密机制,这一次继续认识下OpenSSL加密标准,PKI加密体系,以及同态加密的概念。 (5)OpenSSL标准 OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用...
  • 区块链最核心的两个技术点是共识机制和密码学,由于共识机制是公链的基础,所以这部分内容我已经在前面的内容中优先讲解了。... 区块链中主要应用了两类密码学算法,第一类是哈希算法,第二类是非对称加密算法。...
  • 区块链加密机制

    千次阅读 2018-07-12 18:12:14
    加密机制是整个区块链中的基础,很多文章都有对加密机制进行详细的分析,但是相当不容易理解,我这里用简单的语言来尝试解释以下区块链加密机制 哈希算法(hash) 哈希算法算是区块链中不可或缺的一种算法,它能把...
  • 哈希加密算法

    2018-11-04 16:49:31
    区块链哈希加密算法 参考阅读: 1、《区块链技术指南》 2、《精通比特币》 3、密码学与安全技术
  • 来源|《商用区块链技术与实践》责编 | 晋兆雨头图 |付费下载于视觉中国*文末有赠书福利安全性是实现区块链系统功能的基础,也是目前阻碍区块链应用推广的因素之一。密码学是信息安全的基石...
  • 哈希算法 1.1. 简介 计算机行业从业者对哈希这个词应该非常熟悉,哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。通常业界使用y = hash(x)的方式进行表示,该哈希函数实现对x进行...
  • 不同的区块链项目,我们需要不同的共识算法来确保区块链上最后的区块能在任何时候都反映出全网状态。那区块链主流的共识算法都有哪些...简单说,你将区块中的数据都打包并加密,直到你获得有效的哈希值。  优势:...
  • (一) 哈希算法哈希算法是一种常见的单向加密算法,它将一串数据加密生成一串二进制,但不能由二进制还原为原来的数据。该算法有一下特点:· 相同的输入得到相同的二进制串· 不同对输入得到不同的二进制串,即...
  • 加密货币到区块链;从比特币到钱包……今天我们再学点新知识。 1、哈希算法是什么? 哈希算法又叫散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。它的原理其实...
  • 作用在学习哈希算法前,我们需要知道哈希区块链的作用哈希算法的作用如下:区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链哈希值能够唯一而...
  • 加密算法是指对数据进行一定的加密处理,让自己人可以识别,而别人无法识别的一种算法,哈希算法是常用的加密算法之一。简单说哈希算法就是对于任意一个数据(计算机领域叫字符串),通过哈希算法都可以产生一个256...
  • 哈希密码,哈希碰撞的含义,即我们有一个值x经过哈希变换...所有导致哈希密码是安全性很高的一种加密方法。MDK5曾经很流行的一种哈希值,但是后来被发现可以人为去计算出哈希值,因此现在不算很权威的验证的方法了...
  • 区块链中的加密

    万次阅读 2019-05-05 09:08:15
    哈希算法是一种常见的单向加密算法,它将一串数据加密生成一串二进制,但不能由二进制还原为原来的数据。该算法有一下特点: 相同的输入得到相同的二进制串 不同对输入得到不同的二进制串,即有强对抗性,不同的...
  • 问题导读 1.哈希算法区块链的作用是什么?...区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。 区块链哈希值能够唯一而精准地标识一个区块,区块...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 202
精华内容 80
关键字:

区块链哈希加密算法