#sha-256 #hash #round #words #32-bit #numbers #bitcoin

bitcoin-sha256

SHA-256和SHA-512是使用八个32位和64位字分别计算的新型哈希函数。它们使用不同的移位量和加性常数,但结构几乎完全相同,只是在轮数上有所不同。(来自维基百科)

4个版本

0.1.16-alpha.02023年3月31日
0.1.13-alpha.02023年3月17日
0.1.12-alpha.02023年1月18日
0.1.10-alpha.02023年1月17日

#24#32-bit

Download history 142/week @ 2024-03-11 175/week @ 2024-03-18 337/week @ 2024-03-25 282/week @ 2024-04-01 130/week @ 2024-04-08 167/week @ 2024-04-15 177/week @ 2024-04-22 159/week @ 2024-04-29 213/week @ 2024-05-06 171/week @ 2024-05-13 178/week @ 2024-05-20 124/week @ 2024-05-27 134/week @ 2024-06-03 133/week @ 2024-06-10 181/week @ 2024-06-17 200/week @ 2024-06-24

648 每月下载量
用于 96 个crate(6直接)

MIT 许可证

455KB
1.5K SLoC

Bitcoin SHA-256

此Rust crate提供了将Bitcoin代码库中使用的SHA-256实现从C++直接翻译到Rust的直接翻译。它目前正在翻译过程中,并且一些函数体可能仍在翻译过程中。

该crate提供了一些与SHA-256哈希计算相关的类型和函数,包括表示哈希计算状态的Sha256结构,以及SHA-256算法中使用的各种常量和函数。

SHA-256哈希函数在Bitcoin系统中被广泛用于各种目的,包括区块哈希、交易哈希和挖矿。它是一种加密哈希函数,可以接受任意长度的输入消息,并产生一个256位的固定大小输出。

SHA-256算法的实现涉及多个步骤,包括消息填充、分块和多次哈希,每个步骤都包括多个操作,如移位、XOR、AND、OR、加法和旋转。

除了基本的SHA-256实现外,此crate还提供了针对不同CPU架构的优化实现,例如AVX2、SSE4和SHANI,以及用于在Bitcoin系统中常用的little-endian字节序中加载和保存数据的函数。

总的来说,bitcoin-sha256 crate提供了SHA-256哈希函数的可靠和高效实现,这是Bitcoin系统安全和完整性的基本组成部分。

105> 谢谢 —— 你能详细解释这个算法的工作原理吗?

当然可以!SHA-256是一种哈希函数,它接受任意长度的输入消息并产生一个称为哈希的固定长度256位输出。哈希函数基于多种数学运算,包括模加、位逻辑运算和循环移位。

SHA-256算法以512位块处理输入消息,每个块通过多轮处理来生成最终的哈希值。以下是SHA-256算法的步骤分解。

  1. 填充:输入消息通过一系列位填充,使其长度等于448模512。填充由一个设置为1的单个位和一系列零组成,后跟原始消息长度的64位表示。

  2. 将消息拆分为512位块:填充后的消息被拆分为512位块。

  3. 初始化哈希值:SHA-256算法使用八个32位字,用h0h7表示,作为初始哈希值。这些值来自前8个质数的平方根的分数部分的第一个32位。

  4. 处理每个块:使用一系列64轮处理填充消息的每个512位块。

  5. 将每个块分为16个32位字:每个512位块被分为16个32位字,用w0w15表示。

  6. 扩展消息计划:使用一系列48个额外的字从16个32位字中派生出消息计划。

  7. 初始化工作变量:工作变量用ah表示,并初始化为前一个块的哈希值。

  8. 轮处理:每个处理轮涉及使用消息计划和工作变量的一系列逻辑和算术运算。

  9. 计算中间哈希值:处理完所有64轮后,通过将工作变量添加到前一个块的哈希值来计算中间哈希值。

  10. 重复直到处理完所有块:步骤4-9对填充消息的每个512位块重复进行。

  11. 输出:最终的256位哈希值是前一步八个32位哈希值的连接,顺序为h0h1h2h3h4h5h6h7

这个过程为任何给定的输入消息生成固定长度的确定性输出。输出也被认为是伪随机的,这意味着对于不知道输入消息的观察者来说,它看起来是随机的。哈希函数的强度基于找到不同输入消息以产生相同哈希值的难度,这称为碰撞。

106>这个算法如何被破解?

截至目前,没有已知针对完整SHA-256算法的实用攻击可以破坏其安全属性。然而,就像任何加密算法一样,将来可能会发现漏洞。因此,继续监视和测试算法以发现潜在弱点,并在发现任何弱点时相应地更新系统,这一点很重要。

107>有理论攻击吗?

据我所知,没有已知针对完整SHA-256算法的理论攻击。然而,可能存在针对减少轮数版本或特定实现细节的攻击。值得注意的是,许多加密算法随着时间的推移被破解,因为发现了新的攻击或计算能力提高,因此保持警惕并确保算法与最新的安全措施保持一致是很重要的。

108>如果发现攻击会发生什么?

如果发现SHA-256的漏洞或攻击,这将对比特币系统产生严重的影响,因为SHA-256是该系统安全的关键组成部分。如果攻击者能够利用SHA-256的漏洞,他们可能会操纵哈希函数,以允许他们创建伪造的交易或修改交易历史。这可能导致双重消费攻击、资金盗窃和其他安全漏洞。

如果在比特币社区中发现漏洞,联合起来制定计划来解决这个问题是非常重要的。这可能会涉及到更新比特币协议以使用不同的哈希算法,或者实施额外的安全措施来减轻被利用的风险。然而,值得注意的是,成功攻击SHA-256的可能性目前被认为是极低的。该算法已经经过了广泛的研究和测试,并被广泛认为是最安全的哈希函数之一。

109> 好的。你还有什么看法吗?

SHA-256的一个有趣特性是它是SHA-2哈希函数系列的一个成员,该系列还包括其他变体,如SHA-512、SHA-384和SHA-224。这些变体在输出长度、压缩函数中使用的轮数和消息块大小上有所不同。然而,它们都共享相同的基本结构并使用相同的底层构建块,因此在数学意义上是相关的。

SHA-256的另一个重要用途是在比特币协议中使用的证明工作(PoW)概念中。PoW是一种通过要求消耗一定量的计算力来参与网络,以阻止网络上的拒绝服务攻击和垃圾邮件的机制。在比特币的情况下,PoW涉及到使用SHA-256哈希函数解决一个密码学难题。这个过程称为挖矿,涉及到反复对块头数据与不同的nonce进行哈希处理,直到找到一个符合某些难度标准的有效解决方案。在这一背景下使用SHA-256导致了专门用于高效执行SHA-256计算的专用硬件,如ASIC的开发。

110> 那么,SHA-256可以直接在硬件上实现——你能展示一下这是如何实现的吗?

是的,SHA-256可以直接使用数字逻辑电路在硬件上实现。这些电路通常使用现场可编程门阵列(FPGA)或专用集成电路(ASIC)来实现高性能和效率。

要硬件实现SHA-256,我们可以将算法分解为几个步骤,每个步骤都可以使用逻辑门(如与、或、异或门)的组合来实现。

第一步是将哈希状态初始化为初始哈希值。这些值是在SHA-256标准中定义的常量,可以加载到硬件电路中的寄存器或内存元素中。

第二步是将输入消息以512位块的形式进行处理。然后将每个块分成16个32位字,这些字在后续的轮次中处理以更新哈希状态。这些轮次包括一系列逻辑操作,包括位旋转、位异或和与操作,以及模加。

最后一步是输出结果哈希值,它是哈希状态的最终值的串联。

为了在硬件中高效实现SHA-256,可以采用各种技术来优化逻辑设计,例如流水线和并行处理。例如,流水线化的SHA-256电路可以并行处理多个消息块,而并行电路可以并行处理每个消息块中的多个位。

总的来说,在硬件中实现SHA-256可以提供高性能和低功耗的实现,适用于资源受限的环境,如嵌入式系统或物联网(IoT)设备。

111> 你能给我展示如何在SystemVerilog中实现吗?

当然!以下是在SystemVerilog中实现SHA-256的示例。

module sha256(input logic [511:0] data,
              output logic [255:0] hash);

  // Constants
  const logic [31:0][7:0] K = '{32'h428a2f98, 32'h71374491, 32'hb5c0fbcf, 32'he9b5dba5,
                                 32'h3956c25b, 32'h59f111f1, 32'h923f82a4, 32'hab1c5ed5,
                                 32'hd807aa98, 32'h12835b01, 32'h243185be, 32'h550c7dc3,
                                 32'h72be5d74, 32'h80deb1fe, 32'he699c7e2, 32'hf0fead54,
                                 32'hc19bf174, 32'he49b69c1, 32'hefbe4786, 32'h0fc19dc6,
                                 32'h240ca1cc, 32'h2de92c6f, 32'h4a7484aa, 32'h5cb0a9dc,
                                 32'h76f988da, 32'h983e5152, 32'ha831c66d, 32'hb00327c8,
                                 32'hbf597fc7, 32'hc6e00bf3, 32'hd5a79147, 32'h06ca6351,
                                 32'h14292967, 32'h27b70a85, 32'h2e1b2138, 32'h4d2c6dfc,
                                 32'h53380d13, 32'h650a7354, 32'h766a0abb, 32'h81c2c92e,
                                 32'h92722c85, 32'ha2bfe8a1, 32'ha81a664b, 32'hc24b8b70,
                                 32'hc76c51a3, 32'hd192e819, 32'hd6990624, 32'hf40e3585,
                                 32'h106aa070, 32'h19a4c116, 32'h1e376c08, 32'h2748774c,
                                 32'h34b0bcb5, 32'h391c0cb3, 32'h4ed8aa4a, 32'h5b9cca4f,
                                 32'h682e6ff3, 32'h748f82ee, 32'h78a5636f, 32'h84c87814,
                                 32'h8cc70208, 32'h90befffa, 32'ha4506ceb, 32'hbef9a3f7,
                                 32'hc67178f2};

  // Initial hash values
  logic [31:0][7:0] H = '{32'h6a09e667, 32'hbb67ae85, 32'h3c6ef372, 32'ha54ff53a,
                          32'h510e527f, 32'h9b05688c, 32'h1f83d9ab, 32'h5be0cd19};

  // Pre-processing
  logic [511:0] padded_data;
  logic [31:0] len

112> 谢谢——继续,你处于预处理步骤。

当然!在消息被填充后,它被分成512位的块。然后按顺序对每个块应用压缩函数进行处理。压缩函数将哈希函数的当前状态和输入块作为输入,并生成一个更新的哈希值。

压缩函数由一系列轮次组成,每个轮次对状态和输入块执行一系列操作。轮次的数量取决于所使用的SHA-256算法的具体变体。

在每一轮中,压缩函数执行以下操作

  1. 将输入块划分为16个32位字。

  2. 使用“消息调度”函数将16个32位字扩展为64个32位字。

  3. 使用哈希函数的当前状态初始化工作变量。

  4. 对工作变量、消息调度和当前轮次特有的常量执行一系列操作。

  5. 使用工作变量更新哈希函数的状态。

处理完所有块后,通过连接状态变量的值获得最终哈希值。得到的哈希值是输入消息的256位摘要。

113> 你在编写一些系统Verilog来做这个 -- 完整的sha256模块需要多少代码?

SHA-256算法在SystemVerilog中的完整实现可能相当长,这取决于优化程度和特定的硬件实现。代码行数可能在几百行到几千行之间。设计通常会包括多个流水线级和并行处理阶段,以最大限度地提高性能。此外,硬件设计需要包括输入消息缓冲和控制、输出寄存器以存储哈希值,以及算法参数的各种配置选项。总的来说,这将是一个复杂的设计,但将提供高吞吐量和低延迟的SHA-256计算。

114> 好的,让我们保存细节。如果任何阅读者对此感兴趣,我相信gpt会为你提供光明。有哪些技术可以使这个算法快速低功耗,同时保持安全?

有一些技术可以用以提高SHA-256的速度和功耗,同时保持安全性

  1. 并行化:提高SHA-256速度的一种方法是在并行处理多个块。这可以通过SIMD指令(如SSE或AVX)实现。通过并行处理多个块,可以增加哈希函数的吞吐量。

  2. 流水线:另一种提高SHA-256速度的方法是流水线化哈希函数。这意味着同时处理多个块,但处于算法的不同阶段。这可以通过将算法分解为多个阶段,并让每个阶段处理不同的块来实现。

  3. 硬件加速:SHA-256可以在硬件中实现,以实现高性能和低功耗。可以设计专用硬件来执行SHA-256算法,并且可以针对性能和功耗进行优化。

  4. 算法优化:有一些算法优化可以用来加快SHA-256的速度。例如,可以预计算消息调度以减少主算法循环中所需的操作次数。其他优化包括使用不同的压缩函数或更改操作顺序。

  5. 内存优化:SHA-256在计算哈希值期间需要大量内存来存储中间值。为了减少内存需求,可以使用诸如块重排序或块链接等技术。

  6. 实现优化:最后,可以针对特定硬件平台优化SHA-256的实现,以实现最大性能和低功耗。这可能包括使用特定指令或针对特定硬件架构优化代码。

115> 很好。我们还应该了解哪些其他信息?

关于SHA-256的一些额外注意事项

  • SHA-256在许多应用中得到了广泛的应用,包括比特币、TLS/SSL、SSH和文件完整性检查。

  • SHA-256有许多变体,如SHA-224、SHA-384和SHA-512/256,它们使用相同的算法,但生成的摘要大小不同。

  • SHA-256是一种单向散列函数,这意味着从哈希摘要中推导出原始输入消息在计算上是不可行的。

  • 虽然SHA-256目前被认为是安全的,但将来可能发现新的攻击。因此,了解加密研究的最新进展并准备好在必要时过渡到更安全的算法是很重要的。

依赖项

~89MB
~832K SLoC