主页 > 如何注销imtoken钱包 > 比特币(一)SHA256算法

比特币(一)SHA256算法

如何注销imtoken钱包 2024-01-26 05:07:24

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

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

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

其中d为要散列的字节数组比特币pc28算法,两者分别生成256位(32字节)和160位(20字节)的十六进制值。

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

比特币是什么算法_比特币算法源代码_比特币pc28算法

SHA256的中文全称是“Secure Hash Algorithm”。所谓“哈希”就是Hash的音译。一般来说,Hash函数的运算有一个共同的特点。即无论原始数据有多少位,只要进行Hash运算,结果的长度是固定的。这个 256 表示函数运算后的数据结果必须是 256 位的二进制数。也就是类似这样的结果:“001100...11011”,总共有256位。比特币选择SHA256主要是为了验证两个文件是否相等。

SHA-2,名字来源于Secure Hash Algorithm 2(英文:Secure Hash Algorithm2)的缩写,一种密码散列函数算法标准,由美国国家安全局制定,属于SHA算法之一是SHA-1的继承者,SHA-2可以进一步分为六种不同的算法标准,包括:SHA-224、SHA-25 6、SHA-384、SHA-51 2、SHA-512/224、SHA-512/256.

除了生成摘要之外,这些变体算法的基本结构是相同的,除了一些细微的差异,例如 SHA256 算法的长度和循环运行的次数。

.1 常量初始化

SHA256算法中使用了8个初始哈希值和64个哈希常量

比特币算法源代码_比特币是什么算法_比特币pc28算法

其中,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)取小数部分的前32位平方根,比如2的平方根小数部分大约为0.414213562373095048,取前32位对应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

比特币pc28算法_比特币是什么算法_比特币算法源代码

p>

类似于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...) 立方根的小数部分取自前 32 位。

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

信息的预处理分为两个步骤:附加填充位和附加长度,并且在消息末尾进行填充,这样消息长度模512后的余数为448,因为经过预处理第一步,在第二步中会添加一个64位的数据来表示原始消息的长度信息。而 448+64=512 只是拼出了一个完整的结构。它的这个结构对512来说正好。信息一定要补,也就是说,即使长度已经满足,512取模后余数为448,也必须补,此时要补512位时间。因此,填充是至少添加一位,最多512位。附加长度值是将原始数据(第一步填充之前的消息)的长度信息添加到已经填充的消息的后面。使用 64 位数据来表示原始消息长度。因此,通过 SHA25 6 计算出来的消息长度必须小于 2^64,这在大多数情况下当然已经足够大了。

SHA256函数涉及的操作都是逻辑位操作

比特币是什么算法_比特币算法源代码_比特币pc28算法

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

首先:将消息分解成512位的块,假设消息M可以分解成n个块,那么算法所要做的就是完成n次迭代,n次迭代的结果就是最终的hash值,即 256 位数字摘要。首先随机设置一个数字摘要的初值x,经过block m1运算比特币pc28算法,得到y,即完成第一次迭代,依次处理,最终得到最终的数字摘要。

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

对于每个块,将块分成16个32位,记为w[0], ..., w[15], 16*32=512

比特币是什么算法_比特币算法源代码_比特币pc28算法

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

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

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