hash函数思想以及sha256算法

hash函数:就是将任意长度的输入转化为固定长度的输出,hash函数是没有密钥的,是一个单向的过程,只能由数据算出hash值,不能倒推,在区块链中主要是将数据转化为固定长度的摘要,常用于身份验证和数字签名,如下图所示的式子。

那么为什么要转化为摘要呢?直接传输不好吗?
如果直接传输数据,那么万一数据被他人修改了,你得到了假数据怎么办,所以需要进行hash运算,这样如果数据发生更改,那么它与之前hash值就一定不相同,如果两次数据进行hash,得到的hash值一样,那么就能保证数据没有被修改。
h(x)=y

由于上述原因,就需要hash函数具有一些特性:
1)输入可以任意长度,输出是固定长度。
2)计算hash值的速度比较快。
3)防碰撞性:两个不同的输入数据经过hash运算,hash值不应该相同。
4)单向性:只能由原始数据推出hash值,不能进行逆推。
5)谜题友好:无法从输入数据,判断出输出的hash值是什么样子的。
6)雪崩效应:输入文本微小更改,都将导致完全不同的哈希输出。

下面介绍sha256函数的实现。

1.信息预处理
分为两个步骤:
1)消息的填充:就是将原始数据M的长度进行扩展,原始数据后面加“1”,接着其余加“0”,直到扩展后的数据M’ mod 512 = 448位为止。
注: 若原始数据本身就为448的倍数,那么仍然需要进行扩展,即在后面再填512位。例如:原始数据为449位,那么就需要补511位。
2)添加原始数据长度到末尾:这一部分是把最初始的数据长度大小添加到448位之后,总共占64位,加起来正好512位(空出的64位就是表示原始数据的长度,64位能表示的原始数据长度已经很长了,基本够用)。

2.设置初始哈希值: 这个值由8个32位的字组成,这些字是通过获取前8个质数,即{2,3,5,7,11,13,17,19}这8个质数的平方根的小数部分的前32位获得。
例如: √2=1.41421356237309504880… (从小数点之后取前32位,并用二进制表示)
最终得到8个32位的字,因为后续是需要迭代的(即每处理一个512位数据块就需要在它的上一个进行处理的512位数据块的输出,之前的数据块输出正好是8个32位的数据,而第一个数据块没有其它数据块在它前面,所以需要设置8个32位数据的初值)。
设初始8个32位字为{h0,h1,h2,h3,h4,h5,h6,h7};

3.还需要初始化64个值一次迭代需要进行64次循环的,每一次都需要一个值来进行运算),设为k[0],k[1],k[2],…k[63]。
这64个值为从2开始到311的64个素数的立方根进行表示的前32位
例如³√2=1.25992…(取小数点后前32位,并用二进制表示)

4.生成哈希 需要以下几步生成:
1)经过信息预处理 之后,现在的消息已经是512位的倍数,所以接下来需要将消息等分,每一块长度为512位
2)然后将512位数据再进行等分,分成16块,每块32位 (这里看出来了吧,正好跟第3步的64个值的位数相同 ,位数相同,正好可以进行运算)。
3)需要将16个32位的数据块再扩展成64个32位的数据块(正好跟第3步的数据块数还有大小相等)。
讲一下怎么进行扩展的
对于16个32位的数据块,我们记作w[0],w[1],…,w[15];
前16个数据块保持不动,那么是不是还需要48个数据块,才能凑成64个呢?
所以从i从16开始扩充 (16<=i<=63)
w[i] = w[i-16] + s0 + w[i-7] +s1;
其中s0 = (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightrotate 3);
s1 = (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 10);
注: rightrotate数据循环左移的意思,比如1101循环左移2位,结果为0111。
xor为异或的意思。
4)接下来的操作如图所示
在这里插入图片描述
图中的ABCD…H的值为{h0,h1,…,h7};(这里的h0,…,h7如果为第一个块进行运算则值为设置初始哈希值 步骤中的那8个32位的字)
田字形 意思为两个数字加在一起,结果需要跟232进行求余操作,即**(w[i]+k[i]) mod 232
其中k[i]为之前初始化的64个值,即从2开始到311的64个素数的立方根进行表示的
前32位**。
w[i]为扩展的64个32位的数据块
下面给出Ch、∑1、Ma、∑0的含义。
Ch(E,F,G) = (E∧F) ⊕(¬E∧G)
Ma(A,B,C) = (A∧B)⊕(A∧C)⊕(B∧C)
∑0(A) = (A>>2)⊕(A>>13)⊕(A>>12)
∑1(E) = (E>>6)⊕(E>>11)⊕(E>>25)
不理解的同学可以不用管,清楚有这回事就行。
最后ABC…H的新值就有了(大家可以发现ABC…H经过此过程值变了),之后重复执行63次,总共需要进行64次循环
如果后面还有数据块,那么开始进行第二个(此过程需要用到上一次的ABC…H的值)…,直到数据最终全部走完,得到的最终的ABC…H的值就是此消息的hash值

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值