这是为了让您对哈希算法执行过程中实际发生的事情有一个基本的了解。我使用SHA-512算法是为了帮助解释哈希函数的内部工作。SHA-512是一种哈希算法,它对给定的数据执行哈希函数。哈希算法被广泛应用于网络安全、数字证书甚至区块链等领域。由于哈希算法在数字安全和密码学中扮演着如此重要的角色,对于称为SHA-512的哈希算法来说,这是一个易于理解的演练,包括一些基本和简单的数学知识以及一些图表。它是一组称为SHA-2的哈希算法的一部分,其中包括SHA-256,也用于比特币区块链的哈希算法。
在开始解释SHA-512之前,我认为有一个关于哈希值函数的特性的基本概念是很有用的。
哈希函数
哈希函数将一些数据作为输入,并为输入数据生成固定长度的输出(称为哈希摘要)。然而,这个输出应该满足一些有用的条件。1. 均匀分布: 由于输出哈希摘要的长度是固定的,输入大小可能会有所不同,因此很明显,对于不同的输入值,将会得到一些输出值。即使是这样,哈希函数也应该是这样的:对于任何输入值,每个可能的输出值都应该是等可能的。也就是说,对于任何给定的输入值,每个可能的输出都有相同的可能性产生。2. 固定长度: 这应该是不言自明的。输出值都应该是固定长度的。例如,哈希函数的输出大小可以是20个字符,也可以是12个字符,等等。SHA-512的输出大小可以是512位。3. 意见冲突: 简单地说,这意味着不存在任何不可能找到两个不同的输入哈希函数,导致相同的输出(哈希摘要)。这是关于哈希函数的简单介绍。现在让我们看看SHA-512。
哈希算法- SHA-512
所以SHA-512分几个阶段工作。这些阶段如下:· 输入格式· 哈希缓冲初始化· 消息处理· 输出让我们一个一个看。
1. 输入格式:
SHA-512实际上不能散列任何大小的消息输入,即它有输入大小限制。这个限制是由它的结构决定的,你可以在后面看到。整个格式化的信息基本上有三个部分:原始消息、填充位、原始消息的大小。它们的组合大小应该是1024位的整数倍。这是因为格式化的消息将被处理为每个1024位的块,因此每个块应该有1024位可以使用。
<pic: original message>
填充位接收输入消息并向其添加一些填充位,以使其达到所需的长度。用于填充的位只是带有前导“1”(100,000…000)的“0”位。另外,根据算法,即使是1,也需要进行填充。所以一个内边距只能是1。总大小应该等于128位,而不是1024的倍数,因为目标是将格式化的消息大小作为1024位的倍数(N x 1024)。<pic:msg + pad>
带有极限大小的消息然后,附加算法的原始消息的大小。这个大小值需要用128位表示,这是SHA-512对其输入消息有限制的唯一原因。自原始消息的大小需要用128位表示,消息大小可以最多(2¹²⁹1)位,也考虑到必要的单一填充,它最大的大小将(2¹²⁹2)位。尽管这个极限存在,它实际上并不造成问题,因为实际的限制是如此之高(2¹²⁹2 = 680564733841876926926749214863536422910位)。<pic:msg + pad + size>
带有填充大小的消息,即填充位和消息的大小已被追加,剩下的是完全格式化的SHA-512算法输入。
2. 哈希值值缓冲初始化:
该算法的工作方式是使用前一个块的结果处理来自消息的每个1024位的块。现在,这给前1024位块带来了一个问题,它不能使用任何以前处理的结果。这个问题可以通过使用第一个块的默认值来解决,以便启动该进程。(看一下倒数第二张图)。由于每个中间结果都需要用于处理下一个块,因此需要将其存储在某个地方以供以后使用。这将由哈希值值缓冲区来完成,它还将保存SHA-512整个处理阶段的最后一个哈希值值摘要,作为这些“中间”结果的最后一个。因此,用于启动每个1024位块的链处理的默认值也存储在处理开始时的哈希值值缓冲区中。实际使用的值无关紧要,但是对于感兴趣的人来说,使用的值是通过取前8个素数(2,3,5,7,11,13,17,19)平方根的小数部分的前64位得到的。这些值称为初始向量(IV)。为什么是8个质数而不是9个?因为哈希值缓冲区实际上由8个子部分(寄存器)组成,用于存储它们。<pic:IV>
哈希缓冲区和初始化向量值3. 消息处理:消息处理是在格式化的输入上进行的,每次取一个1024位的块。实际的处理是通过使用两个东西来进行的:1024位块和前一个处理的结果。SHA-512算法的这一部分包括几个“回合”和一个加法运算。
<pic:格式化输入1024位块;n, H.n-1) = H.n >
因此,使用“消息序列发生”将消息块(1024位)扩展为“Words”。准确地说,是80个单词,每个单词的大小为64位。
Rounds
消息处理阶段的主要部分可以认为是Rounds。每个轮需要3个东西:一个单词、上一轮的输出和SHA-512常量。第一Word没有可以使用其输出的前一轮,因此它对前一个1024位块使用前一个消息处理阶段的最终输出。对于格式化输入的第一个块(1024位)的第一轮,使用初始向量(IV)。SHA-512常量是预先确定的值,每个常量用于消息处理阶段的每个轮。同样,这些不是很重要,但是对那些感兴趣的人来说,它们是前80个素数的立方根的小数部分的前64位。为什么是80个素数?因为有80轮,每轮都需要一个常数。一旦Round函数接受这3个东西,它就对它们进行处理,并给出512位的输出。重复80轮。在第80轮之后,它的输出被简单地添加到前一个消息处理阶段的结果中,以获得此消息处理迭代的最终结果。
4. 输出:
在1024位的每个块通过消息处理阶段(即该阶段的最后一次迭代)之后,我们将得到原始消息的最后512位哈希值值。因此,每个块的中间结果都用于处理下一个块。当最后的1024位块完成处理后,我们就得到了原始消息的SHA-512算法的最终结果。因此,我们从原始消息中获得最终的哈希值。SHA-512是一组哈希算法的一部分,它们的工作方式非常类似,称为SHA-2。SHA-256和SHA-384等算法与SHA-512一起属于这一组。SHA-256也是比特币区块链中指定的哈希值函数。这是SHA-512哈希算法工作原理的简要概述。我打算进一步详细说明是什么使得哈希函数实际上是不可逆的(单向的),以及这对数字安全有什么帮助。