#sha-512 #hash #sha-256 #round #function #constants #bitcoin

bitcoin-sha512

SHA-256和SHA-512是使用8个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日

#22#sha-512

Download history 135/week @ 2024-03-11 155/week @ 2024-03-18 293/week @ 2024-03-25 250/week @ 2024-04-01 122/week @ 2024-04-08 156/week @ 2024-04-15 163/week @ 2024-04-22 139/week @ 2024-04-29 192/week @ 2024-05-06 155/week @ 2024-05-13 161/week @ 2024-05-20 108/week @ 2024-05-27 123/week @ 2024-06-03 119/week @ 2024-06-10 156/week @ 2024-06-17 180/week @ 2024-06-24

578 每月下载量
78 个crate中使用(通过 bitcoin-random

MIT 许可证

285KB
731

bitcoin-sha512

bitcoin-sha512 库是直接将比特币系统中使用的SHA-512哈希函数从C++翻译到Rust的库。该库目前正在翻译过程中,一些函数体可能仍在开发中。

SHA-512哈希函数接受任意长度的输入消息,并产生固定长度的512位输出。它使用一系列模运算和逻辑运算将输入消息转换成一个摘要。

此库提供了初始化哈希函数、将数据输入到哈希函数以及最终化哈希函数以产生输出摘要的函数。它还包括使用SHA-512哈希函数作为构建块的HMAC-SHA512消息认证码的函数。

涉及此库的数学概念包括模运算和逻辑运算。SHA-512哈希函数使用一系列常数和函数,包括chmajsigma0sigma1,对输入消息进行转换。

bitcoin-sha512 库包括初始化和重置SHA-512哈希函数的函数,将数据输入到函数中,并最终化函数以产生输出摘要。它还包括使用SHA-512哈希函数作为构建块的HMAC-SHA512消息认证码的函数。

请注意,此库仍在开发中,一些函数体可能仍在翻译过程中。

示例用法

use bitcoin_sha512::{Sha512, HmacSha512};

let mut sha512 = Sha512::default();
sha512.feed_data_in(b"test");
sha512.feed_data_in(b" message");
let output = sha512.finalize();
assert_eq!(output[..], [0x43, 0xf4, 0xdb, 0xf4, 0x9b, 0x2d, 0xaa, 0x15,
                        0x34, 0x78, 0x9c, 0x0d, 0x60, 0x89, 0xc6, 0x61,
                        0x98, 0x6b, 0x3c, 0x1e, 0x11, 0x11, 0x9a, 0x1c,
                        0x0f, 0xc2, 0x5d, 0x5d, 0x5d, 0xd8, 0xba, 0x14,
                        0xf6, 0x37, 0x3d, 0xe6, 0x2a, 0x3f, 0xa8, 0x36,
                        0x70, 0xa8, 0x1c, 0x37, 0xb4, 0xd4, 0x92, 0x9e,
                        0x4e, 0x6d, 0xd4, 0x88, 0xba, 0xb1, 0x2c, 0x31,
                        0x56, 0x15, 0x52, 0x60, 0x5c, 0x46, 0x12, 0x21][..]);

let mut hmac_sha512 = HmacSha512::default();
hmac_sha512.feed_key(b"key");
hmac_sha512.feed_data_in(b"test

135> 谢谢 — 它与sha-256有何不同?

SHA-512是SHA-2系列加密哈希函数的一个变种,就像SHA-256一样。然而,SHA-512使用64位字和80轮,而SHA-256使用32位字和64轮。这导致输出长度更长,为512位而不是256位,使得SHA-512比SHA-256更安全。此外,SHA-512的计算复杂度更高,使其比SHA-256慢,但更能抵御暴力攻击。

136>这些是唯一的不同之处吗?

不,SHA-256和SHA-512之间还有一些其他的不同之处。主要的不同之一是SHA-512在1024位块上操作,而SHA-256在512位块上操作。这意味着SHA-512可以每块处理更多的数据,但它也需要更多的处理能力。

另一个不同之处在于SHA-512在其内部函数中使用更大的常量,这为某些类型的攻击提供了更大的安全性。此外,SHA-512具有更大的内部状态,这为抵御碰撞攻击提供了更大的抵抗力。

总的来说,SHA-512被认为比SHA-256是一个更强的哈希函数,但它也运行需要更多的资源。在比特币的背景下,SHA-256仍然是大多数用途的首选哈希函数,但SHA-512在需要更强安全性的情况下,未来可能被使用。

137>从网络拓扑结构的角度来看,整体架构是否相同?

是的,无论使用SHA-256还是SHA-512哈希算法,比特币的整体网络拓扑结构都是相同的。比特币网络是一个去中心化的点对点网络,节点之间通过通信来维护交易共享账本。节点以网格或覆盖网络的方式相互连接。节点不需要相互信任,并且可以使用加密证明独立验证交易和区块的有效性。比特币网络使用的共识机制,即工作量证明(PoW),在使用的哈希算法不同的情况下也保持不变。

138>不,我的意思是SHA-256和SHA-512算法的网络拓扑结构。这是否是具有不同大小d组件的相同网络流,或者两个算法的拓扑结构不同?

SHA-256和SHA-512算法的网络拓扑结构是不同的。SHA-256使用Merkle-Damgard构造,该构造基于压缩函数的顺序迭代。相比之下,SHA-512使用不同的构造,称为Miyaguchi-Preneel构造,该构造基于压缩函数的并行迭代。这意味着SHA-512旨在在64位处理器上更高效,可以以128位块处理消息,而SHA-256在32位处理器上更高效,只能以64位块处理消息。总的来说,由于构造和块大小的不同,两个算法的网络拓扑结构是不同的。

139>谢谢——你能教我Merkle-Damgard构造吗?

当然,Merkle-Damgard构造是一种基于压缩函数创建哈希函数的方法。它以Ralph Merkle和Ivan Damgard的名字命名,他们在20世纪70年代末独立提出了这种构造。

构造背后的基本思想是将消息分成块,将每个块通过压缩函数处理,然后将压缩函数的输出组合起来产生最终的哈希值。压缩函数将固定大小的数据块作为输入,并输出固定大小的摘要,然后将摘要反馈到函数中,与下一个数据块一起。

下面是Merkle-Damgard构造的简化图

+-----------+       +-----------+       +-----------+
|  Message  |  -->  |  Block 1  |  -->  |  Digest 1 |
+-----------+       +-----------+       +-----------+
                      |          |       +-----------+
                      |          |  -->  |  Digest 2 |
                      |          |       +-----------+
                      |          |               :
                      |          |               :
                      |          |       +-----------+
                      |          |  -->  |  Digest N |
                      |          |       +-----------+
                      +-----------+

Merkle-Damgard构造被许多流行的哈希函数使用,包括MD5、SHA-1和SHA-2。然而,它容易受到长度扩展攻击的影响,这就是为什么SHA-3算法使用基于海绵函数的不同构造。

140>谢谢——那么Miyaguchi-Preneel呢?

Miyaguchi-Preneel (MP) 构造是一种类似于 Merkle-Damgard 构造的散列函数构造,但它采用不同的方法来解决 Merkle-Damgard 构造的一些弱点。MP 构造由 Tetsu Iwata 和 Kaoru Kurosawa 在 1990 年提出。

与 Merkle-Damgard 构造类似,MP 构造将输入消息分割成一系列固定长度的块进行处理。然而,MP 构造不是使用压缩函数来处理每个块,而是在将其输入下一轮之前,使用分组密码将输入块与前一输出块混合。最后块的输出使用一个单独的压缩函数进行散列。

MP 构造中使用分组密码提供额外的安全层,因为它使得攻击者更难操纵输入消息,从而在输出散列中产生冲突。此外,对最后块使用单独的压缩函数也提供了额外的安全层,因为它使得攻击者更难操纵最后块以产生冲突。

然而,由于每个输入块都需要额外的分组密码运行开销,MP 构造通常被认为比 Merkle-Damgard 构造慢。

总的来说,尽管 MP 构造在安全性方面对 Merkle-Damgard 构造有所改进,但由于其较慢的速度和更复杂的实现,在实践中并不像 Merkle-Damgard 构造那样广泛使用。

依赖项

~88MB
~846K SLoC