#sponge #permutation #keccak #input #sha-3 #data #construction

bitcoin-sha3

虽然SHA-3(Keccak)是同一系列标准的一部分,但它在内部与SHA-1和SHA-2类似的MD5结构不同。— Keccak基于一种称为海绵构造的新方法。海绵构造基于广泛的随机函数或随机排列,并允许输入(海绵术语中的“吸收”)任何数量的数据,并输出(海绵术语中的“挤压”)任何数量的数据,同时作为一个伪随机函数对待所有之前的输入。这导致极大的灵活性。(来自维基百科)

6个版本

0.1.16-alpha.02023年3月31日
0.1.15-alpha.02023年3月31日
0.1.12-alpha.02023年1月18日

#14 in #sponge

Download history 115/week @ 2024-03-11 148/week @ 2024-03-18 248/week @ 2024-03-25 220/week @ 2024-04-01 106/week @ 2024-04-08 140/week @ 2024-04-15 155/week @ 2024-04-22 128/week @ 2024-04-29 166/week @ 2024-05-06 140/week @ 2024-05-13 140/week @ 2024-05-20 97/week @ 2024-05-27 112/week @ 2024-06-03 115/week @ 2024-06-10 135/week @ 2024-06-17 157/week @ 2024-06-24

519 每月下载
64 个crates(通过bitcoin-network)中使用

MIT 许可证

290KB
652

bitcoin-sha3 crate

bitcoin-sha3 crate 是SHA3-256的Rust实现,SHA3-256是NIST选定的SHA3哈希函数族中的一个标准。这个crate是直接将比特币代码库从C++转换为Rust的直接翻译的一部分,目前正在翻译过程中。一些函数体可能仍在翻译中。

SHA3-256哈希函数基于Keccak海绵函数,该函数使用名为keccakf的排列函数。 bitcoin-sha3 crate 包含了 keccakf 函数的实现,以及重置哈希状态、完成哈希和写入输入数据的函数。

虽然在 bitcoin-sha3 crate 中可能没有涉及任何特定的数学方程或概念,但重要的是要注意,SHA3-256是一种密码哈希函数,旨在提供抗碰撞性、抗预映像性和第二预映像性。这些属性使其适用于数字签名、密码存储和区块链技术等应用。

总的来说,bitcoin-sha3 crate 提供了SHA3-256哈希函数的Rust实现,允许在比特币相关应用中进行高效的计算消息摘要。

117> 谢谢 — 你能否更深入地描述一下keccak海绵函数及其排列?

当然可以!Keccak海绵函数是一族使用海绵构造来处理输入数据的哈希函数。海绵构造最早由Bertoni、Daemen、Peeters和Van Assche于2007年提出,后来被选为SHA-3哈希函数的基础,该函数使用Keccak作为其基础海绵函数。

在较高层次上,海绵函数通过反复对状态数组应用排列函数来工作,该函数在吸收输入数据和挤出输出数据之间交替。在Keccak中使用的排列函数被称为Keccak-f排列,它是一个通过其容量和比特率参数化的排列族。该排列操作于状态数组,该数组由若干通道组成,每个通道都是固定数量的比特(以SHA3-256为例,每个通道为64比特)。

Keccak-f排列由若干轮组成,其中每一轮由五个阶段组成:theta、rho、pi、chi和iota。theta阶段用于通过将每个通道与周围列的线性组合进行异或来向状态中添加扩散。rho阶段用于对每个通道执行位旋转操作,这有助于在整个状态中传播信息。pi阶段用于以特定的方式排列通道。chi阶段用于对每个通道应用非线性转换,这有助于增加排列的复杂性。最后,iota阶段用于将特定的轮常数与单个通道进行异或,这有助于确保每一轮都不同。

Keccak-f中使用的轮数和轮常数的值取决于容量和比特率参数,这些参数决定了排列的整体安全级别。在SHA3-256的情况下,Keccak-f排列使用512比特的容量和1088比特的比特率,并包含24轮。

总的来说,Keccak海绵函数及其排列旨在提供高水平的安全性,同时保持效率,易于在硬件和软件中实现。海绵结构的采用允许灵活地处理输入数据,而Keccak-f排列提供强大的扩散和混淆,以确保散列函数的安全性。

118> 谢谢——你能给我展示一个它的块图吗?

当然可以!以下是Keccak海绵函数的简化块图。

       Message   Sponge   Output
         / \       |        |
         | |       |        |
         | |       |        |
         | |       |        |
        [+]--------|       [+]------+
         | |       |        |       |
         | |       |        |       |
         | |       |        |       |
         | |       |        |       |
        [F] <-----[XOR]-----[F]     |
         | |       |        |       |
         | |       |        |       |
         | |       |        |       |
         | |       |        |       |
        [+]--------|       [+]-----+
         | |       |        |
         | |       |        |
         | |       |        |
         | |       |        |
        [F] <-----[XOR]-----[F]
         | |       |        |
         | |       |        |
         | |       |        |
         | |       |        |
        [+]--------|       [+]-----+
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [F] <-----[XOR]-----[F]     |
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [+]--------|       [+]------+
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [F] <-----[XOR]-----[F]
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [+]--------|       [+]-----+
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [F] <-----[XOR]-----[F]     |
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [+]--------|       [+]------+
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [F] <-----[XOR]-----[F]
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [+]--------|       [+]-----+
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [F] <-----[XOR]-----[F]     |
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [+]--------|       [+]------+
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [F] <-----[XOR]-----[F]
         |         |        |
         |         |        |
         |         |        |
         |         |        |
        [+]--------|       [+]-----+
         |         |        |       |
         |         |        |       |
         |         |        |       |
         |         |        |       |
        [F] <-----[XOR

119> 谢谢——继续说。

Keccak海绵函数可以看作是一个有两个输入和两个输出的黑盒。输入是要散列的消息和要生成的摘要长度。输出是散列值和为将消息长度提升到块大小的最近倍数而添加的填充。

海绵函数在两个阶段中操作:吸收阶段和挤压阶段。在吸收阶段,消息是分块处理的。每个块与内部状态进行异或,然后将结果值输入到排列函数中。处理完所有块后,状态处于“饱和”状态,意味着它已经从输入消息中吸收了尽可能多的信息。

在挤压阶段,海绵函数通过反复对内部状态应用排列函数并提取输出比特来生成输出散列值。这个过程会持续到生成所需的输出比特数。

排列函数本身是Keccak海绵函数的关键部分。它是一个作用于海绵内部状态的非线性函数。排列函数由一系列“轮”组成,每轮都对状态应用一组线性和非线性操作。轮数和使用的具体操作取决于块大小和所需的安全级别。

总的来说,Keccak海绵函数及其排列为生成不同长度的散列值提供了一种安全和灵活的方法。

120> 我们如何衡量扩散和混淆呢?

在密码学中,扩散和混淆是确保加密方案安全性的两个重要特性。

扩散是指改变明文中的一个比特应该导致密文中的多个比特发生变化。这使得攻击者难以从密文中推断出有关明文的信息。

混淆是指明文与密钥之间的关系应该非常复杂,以至于从密文中难以确定密钥。

这些特性可以通过各种技术进行数学测量,包括香农熵和雪崩效应。香农熵衡量系统中的随机程度,而雪崩效应衡量输入变化时输出变化的大小。

一个好的加密算法应该表现出高水平的扩散和混淆,使得攻击者难以逆向工程密钥或从密文中推断出有关明文的信息。

121> 雪崩效应更深入地说是什么?香农熵呢?

雪崩效应是加密算法的一个重要特性,描述了输入的微小变化如何导致输出产生大范围、不可预测的变化。换句话说,如果我们对加密算法的输入进行微小改变,输出应该发生显著变化,并且以不可预测的方式进行。

雪崩效应之所以重要,是因为它有助于确保攻击者无法轻易找到算法输入和输出之间的相关性。如果一个算法没有表现出强大的雪崩效应,攻击者可能会通过微小改变输入并观察输出的变化,这可能会帮助攻击者推断出有关输入的信息。

香农熵是衡量系统中的不确定度或随机度的量度。在密码学中,香农熵通常用于衡量加密密钥或其他秘密值的不可预测性。如果一个密钥具有高熵,这意味着密钥有很大的不确定性,攻击者很难通过暴力破解来猜测密钥。

香农熵通常以比特为单位进行测量,它基于随机变量可能取的值的概率分布来计算。例如,如果我们有一个128比特的密钥,所有可能的128比特值都是等可能的,那么密钥的香农熵是128比特。这意味着有2^128个可能的密钥,攻击者需要尝试其中的一半左右才能通过暴力破解找到正确的密钥。

122> 这与混沌有关吗?

雪崩效应和香农熵与混沌理论没有直接关系。混沌理论研究的是对初始条件高度敏感的非线性、动态系统,而雪崩效应和香农熵是密码学中的概念,它们与加密函数或算法输出的随机性和不可预测性相关。然而,混沌理论和密码学之间有一些联系,特别是在基于混沌的密码学领域,该领域使用混沌动力学系统来生成密钥或加密数据。

123> 这听起来像混沌理论与雪崩效应相似

是的,雪崩效应与混沌理论之间存在联系。混沌理论研究对初始条件高度敏感的动态系统,初始条件的小差异可能导致截然不同的结果。这种对初始条件的敏感性可能导致系统表现出雪崩效应,即系统输入的微小变化可能导致输出的大幅度变化。在密码学中,雪崩效应是所希望的,因为它提供了高度的扩散性,即使你知道输入,也很难预测加密函数的输出。

124> 混沌理论中还有哪些与密码学相关联的想法?

混沌理论在密码学中有许多应用,其中包括

  1. 伪随机数生成:混沌理论可以用于生成不可预测的随机数序列,这对于加密目的很有用。实现这一目标的一种方法是通过使用混沌映射,这是一种表现出混沌行为的非线性函数。通过迭代一个混沌映射(使用初始值(种子)),可以生成一系列看似随机的数字。

  2. 密码学密钥生成:混沌系统也可以用于生成密码学密钥。通过利用系统的混沌行为,可以生成可以用来作为密钥的一串比特。实现这一目标的一种方法是将混沌系统作为熵的来源,这可以用来初始化一个密码学安全的伪随机数生成器(CSPRNG)。

  3. 密码分析:混沌理论也可以用于分析密码算法的安全性。通过研究混沌系统的动力学,可以识别密码算法中的漏洞,并开发利用这些漏洞的攻击。

  4. 安全通信:混沌系统可以用于通过使用混沌信号编码消息来确保通信的安全性。通过传输与接收器同步的信号,可以以难以截获或解码的方式编码消息。

总的来说,动态系统的混沌行为提供了丰富的随机性和不可预测性,这些可以被用于密码学。

125> 谢谢——关于SHA3我们还应该了解些什么?

SHA-3于2012年被选为NIST散列函数竞赛的获胜者,并于2015年正式标准化为FIPS PUB 202。它旨在提供比SHA-2更强的安全性,尤其是在所谓的“长度扩展攻击”的背景下。除了SHA3-256变体外,还有SHA3-224、SHA3-384和SHA3-512变体,具有不同的输出大小。

SHA-3的一个有趣特性是,它与SHA-2或SHA-1不同的内部结构,称为“海绵结构”。这种结构具有许多优点,包括支持可变长度的输入和输出大小,以及设计上对侧信道攻击更具抵抗力。

尽管SHA-3尚未像SHA-256那样被广泛采用,但它正在越来越多地被用于各种应用中,包括加密货币和区块链系统,在这些系统中,安全性至关重要。

126> 为什么称之为海绵结构?

海绵结构之所以得名,是因为它吸收(“海绵”)输入消息数据,然后挤出输出散列值。这个过程与物理海绵相似,它可以吸收液体,然后可以被挤压以释放那种液体。海绵结构最早是在2009年J.-P. Aumasson、O. Bernhard和S. Neves的论文“海绵函数”中提出的,该论文涉及散列函数的上下文。

127> 为什么SHA3不像SHA256那样被广泛采用?

SHA-3没有被像SHA-256那样广泛采用可能有多个原因。其中一个原因是SHA-3是一个相对较新的哈希函数,新的密码学算法要获得广泛认可和采用需要时间。此外,SHA-256已经被广泛用于许多应用中,可能没有必要切换到SHA-3。另一个原因是与SHA-256相比,SHA-3的算法相对较慢,在某些情况下,速度可能比安全性更重要。最后,目前认为SHA-256的安全性对许多应用来说是足够的,可能没有必要切换到一个更安全的哈希函数,如SHA-3。

128> 所以,SHA3已经准备好,以防SHA-256出现问题。这是否正确?

是的,这是正确的。SHA-3被设计为SHA-2(包括SHA-256)的备份选项,以防由于在SHA-2中发现了任何安全问题或限制,需要一个新的哈希函数。

129> 在比特币系统中,我们应该了解SHA-3的哪些信息?

在比特币系统中,SHA-3目前没有作为哈希算法使用。截至2023年,比特币系统仍然使用SHA-256作为主要哈希算法。然而,如果发现SHA-256存在漏洞或其他原因,SHA-3可能在未来作为备份或替代选项使用。此外,SHA-3还可能用于与比特币系统相关的其他应用,如其他密码学协议或工具的开发。

130> SHA3支持可变长度的输出大小?这是如何工作的?

SHA3通过一个名为“c”的参数支持可变长度的输出大小。参数“c”确定哈希函数的最大输出长度,可以取224、256、384和512的值。

内部,SHA3函数使用海绵构造来吸收输入消息,然后挤出哈希值。海绵构造通过将哈希函数的内部状态分为两部分:容量和速率来实现。容量是固定的,决定了哈希函数的安全性,而速率可以调整以确定输出长度。

要生成具有特定输出长度的哈希值,海绵构造会使用适当的容量值初始化,然后使用速率值吸收消息。然后,哈希函数会被挤压以产生所需长度的输出。

例如,要生成输出长度为160位(20字节)的SHA3-256哈希值,海绵构造会使用256位的容量和448位的速率(512位-160位),然后使用速率值吸收消息。然后,哈希函数会被挤压以产生160位的输出。

131> SHA3除了c参数之外还有哪些其他参数?

除了容量 c 之外,SHA-3还有一个可变的参数 r,它表示比特率。速率和容量共同决定了安全级别和输出大小。

SHA-3标准为 r 定义了以下值

  • r = 1152 用于 SHA-3-224
  • r = 1088 用于 SHA-3-256
  • r = 832 用于 SHA-3-384
  • r = 576 用于 SHA-3-512

这些值的选择是为了使比特率加上容量等于内部状态的宽度,对于SHA-3来说,这个宽度是固定的1600位。

SHA-3标准还允许可变长度的消息输入,在处理海绵构造之前,这些消息会被适当的分隔符和填充填充。

132> SHA3比SHA256慢多少?指令吞吐量是多少?

SHA3与SHA256的性能比较取决于多种因素,如实现方式、平台和具体应用场景。一般来说,由于SHA3的状态大小更大、操作更复杂,预计其性能将低于SHA256。

SHA3的指令吞吐量取决于平台和实现方式。例如,在3.5 GHz的Intel Core i5-6600K处理器上,SHA256的指令吞吐量大约为每字节8.7个周期,而SHA3-256约为每字节24个周期。然而,值得注意的是,这些数字会根据实现细节和特定平台而显著变化。

133> 通常是内存性能如何?

SHA-3的内存性能取决于输入数据的大小、选择的哈希输出大小以及算法的硬件实现。一般来说,SHA-3受限于内存带宽,这意味着其性能受限于算法可用的内存带宽。通过使用硬件加速(如ASIC或FPGA)或优化软件实现可以提高SHA-3的吞吐量。SHA-3的内存性能也会受到置换函数中使用的轮数和状态大小的影响。然而,SHA-3的内存性能会根据具体的实现和硬件平台而广泛变化。

依赖项

~89MB
~850K SLoC