欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

比特币(一)SHA256算法

程序员文章站 2022-03-10 12:15:48
...

SHA256和RIPEMD160,比特币将这两个哈希算法的应用组合成两个函数:

hash256(d)=sha256(sha256(d))

hash160(d)=ripemd160(sha256(d))

其中d为待哈希的字节数组,两者分别生成256位(32字节)和160位(20字节)的16进制数值。

hash256主要用于生成标志符,如区块ID,交易ID等,而hash160主要用于生成比特币地址。

SHA256的中文全称叫做“安全哈希算法”。所谓的“哈希”是Hash的音译,通常来说,Hash函数的运算有一个共同特点。就是不论原始数据有多少位,只要通过Hash运算后,得到结果的长度都是固定的。这个256代表的意思是,数据经过函数运算后得到的结果必须是一个256位的2进制数字。也就是类似这样的结果:“001100……11011”,这其中一共有256位。比特币之所以选择SHA256,主要是为了验证两个文件是否相等。

SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。SHA-2下又可再分为六个不同的算法标准,

包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。

这些变体除了生成摘要的长度 、循环运行的次数等一些微小差异外,算法的基本结构是一致的。

.1 常量初始化

SHA256算法中用到了8个哈希初值以及64个哈希常量

其中,SHA256算法的8个哈希初值如下:

h0 := 0x6a09e667

h1 := 0xbb67ae85

h2 := 0x3c6ef372

h3 := 0xa54ff53a

h4 := 0x510e527f

h5 := 0x9b05688c

h6 := 0x1f83d9ab

h7 := 0x5be0cd19

这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来,举个例子来说,2的平方根小数部分约为0.414213562373095048,取前32bit就对应出了0x6a09e667

在SHA256算法中,用到的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

 

和8个哈希初值类似,这些常量是对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来。

.2 信息预处理(pre-processing)

信息的预处理分为两个步骤:附加填充比特和附加长度,在报文末尾进行填充,使报文长度在对512取模以后的余数是448,因为在第一步的预处理后,第二步会再附加上一个64bit的数据,用来表示原始报文的长度信息。而448+64=512,正好拼成了一个完整的结构。它的这个结构就是对512能刚好的。信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。用一个64位的数据来表示原始消息的长度。因此,通过SHA256计算的消息长度必须要小于 2^64 ,当然绝大多数情况这足够大了。

SHA256函数中涉及的操作全部是逻辑的位运算

现在来介绍SHA256算法的主体部分,即消息摘要(最后的等长哈希码)是如何计算的。

首先:将消息分解成512-bit大小的块,假设消息M可以被分解为n个块,于是整个算法需要做的就是完成n次迭代,n次迭代的结果就是最终的哈希值,即256bit的数字摘要。先随便设一个数字摘要初始值x,经过块m1运算后,得到y,即完成了第一次迭代,依次处理,最后得到最终数字摘要。

处理过程是将256bit的值分成8个小块,这是因为SHA256算法中的最小运算单元称为“字”(Word),一个字是32位。32*8=256.它是按照单元运算的,而不是整个运算:

比特币(一)SHA256算法

对于每一块,将块分解为16个32-bit,记为w[0], …, w[15],16*32=512

构造64个字(word),前16个字直接由消息的第i个块分解得到,其余的字由如下迭代公式得到:

比特币(一)SHA256算法

进行64次循环,Map(H_{i-1}) = H_i包含了64次加密循环,即进行64次加密循环即可完成一次迭代,每次加密循环可以由下图描述:

比特币(一)SHA256算法

通俗说来,这8个小块(数据签名256bit分成8个32bit块)经过非线性运算后向后移动一位,最后一位到前面来。这样的循环要执行64次。因为之前构造了64个字,这样就成功获得签名了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: 比特币