安全散列算法是如何工作的?
安全散列算法 (SHA) 由国家安全局 (NSA) 发明,并于 1993 年通过国家标准与技术研究院 (NIST) 作为美国联邦信息处理标准 (FIPS PUB 180) 发布。
SHA 依赖于 MD4 算法并共享与其类似的构建块。SHA 的设计引入了一个新流程,该流程将压缩函数的 16 字消息块输入开发到 80 字块,除此之外还有其他内容。
SHA 的处理过程如下:
步骤 1 − 追加填充位 − 对原始消息进行填充,使其长度与 448 模 512 同余。即使消息已达到所需长度,也会持续插入填充。填充包括单个 1 后跟必要数量的 0 位。
步骤 2 − 追加长度 − 将一个 64 位块(视为无符号 64 位整数,最重要的字节在前)添加到消息中,该块定义原始消息的长度(步骤 1 中填充之前)。完整消息的长度是 512 的倍数。
步骤 3 − 初始化缓冲区 − 缓冲区包含五个 (5) 个 32 位寄存器,分别表示为 A、B、C、D 和 E。此 160 位缓冲区可用于影响压缩函数的临时和最终结果。这五个寄存器初始化为以下 32 位整数(以十六进制表示)。
A = 67 45 23 01
B = ef cd ab 89
C = 98 ba dc fe
D = 10 32 54 76
E = c3 d2 e1 f0
寄存器 A、B、C 和 D 实际上与 MD5 算法中使用的四个寄存器相同。但在 SHA-1 中,这些值以大端格式保存,这意味着字的最重要字节位于低地址字节位置。因此,初始化值(以十六进制表示)如下:
字 A = 67 45 23 01
字 B = ef cd ab 89
字 C = 98 ba dc fe
字 D = 10 32 54 76
字 E = c3 d2 e1 f0
步骤 4 − 以 512 位块处理消息 − 压缩函数分为 20 个连续步骤,包括四个处理轮次,每一轮都由 20 个步骤组成。
这四个轮次在结构上彼此相同,唯一的区别在于每个轮次都需要一个不同的布尔函数(可以定义为 f1、f2、f3、f4)和四个多加常数 Kt(0 ≤t ≤79)中的一个,这取决于所考虑的步骤。
步骤 5 − 输出 − 处理完最终的 512 位消息块 t(假设消息被分成 t 个 512 位块)后,可以得到一个 160 位的消息摘要。