4. Message Padding and Parsing (消息填充和解析)
本文规定的散列函数用于计算作为输入提供的消息或数据文件的消息摘要. 消息或数据文件应被视为位串. 消息的长度是消息中的位数(空消息的长度为0). 如果消息中的位数是8的倍数,为了紧凑性,我们可以用十六进制表示消息. 消息填充的目的是使填充后消息的总长度成为512的倍数(对于SHA-224和SHA-256)或1024的倍数(对于SHA-384和SHA-512).
以下规定了如何执行此填充. 总结而言,将一个"1"后跟 m 个"0",再后跟64位或128位整数附加到消息的末尾,以产生长度为512n或1024n的填充消息. 附加的整数是原始消息的长度. 然后,填充的消息由散列函数作为 n 个512位或1024位块进行处理.
4.1. SHA-224 and SHA-256
假设消息的长度为 L < 2^64. 在将其输入散列函数之前,消息在右侧填充如下:
a. 附加"1". 示例: 如果原始消息是"01010000",则填充为"010100001".
b. 附加 K 个"0",其中 K 是以下方程的最小非负解
( L + 1 + K ) mod 512 = 448
c. 然后附加64位块,即 L 的二进制表示. 附加此块后,消息的长度将是512位的倍数.
示例: 假设原始消息是位串
01100001 01100010 01100011 01100100 01100101
步骤(a)之后给出
01100001 01100010 01100011 01100100 01100101 1
由于 L = 40,上述的位数是41,附加 K = 407 个"0",使总数现在为448. 这以十六进制给出以下内容:
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
L = 40 的64位表示是十六进制 00000000 00000028. 因此,最终填充的消息是以下十六进制:
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028
4.2. SHA-384 and SHA-512
假设消息的长度为 L < 2^128. 在将其输入散列函数之前,消息在右侧填充如下:
a. 附加"1". 示例: 如果原始消息是"01010000",则填充为"010100001".
b. 附加 K 个"0",其中 K 是以下方程的最小非负解
( L + 1 + K ) mod 1024 = 896
c. 然后附加128位块,即 L 的二进制表示. 附加此块后,消息的长度将是1024位的倍数.
示例: 假设原始消息是位串
01100001 01100010 01100011 01100100 01100101
步骤(a)之后给出
01100001 01100010 01100011 01100100 01100101 1
由于 L = 40,上述的位数是41,附加 K = 855 个"0",使总数现在为896. 这以十六进制给出以下内容:
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
L = 40 的128位表示是十六进制 00000000 00000000 00000000 00000028. 因此,最终填充的消息是以下十六进制:
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028