跳到主要内容

4. 消息填充和解析

本文规定的哈希函数用于为作为输入提供的消息或数据文件计算 message digest. 消息或数据文件应被视为 bit string. 消息长度是消息中的 bit 数 (空消息长度为 0). 如果消息中的 bit 数是 8 的倍数, 为了紧凑表示, 可以用十六进制表示该消息. 消息填充的目的是使填充后消息的总长度对于 SHA-224 和 SHA-256 成为 512 的倍数, 或对于 SHA-384 和 SHA-512 成为 1024 的倍数.

以下内容规定如何执行此填充. 概括而言, 在消息末尾追加一个 "1", 后跟 m 个 "0", 再后跟一个 64 位或 128 位整数, 以生成长度为 512n 或 1024n 的填充后消息. 追加的整数是原始消息的长度. 然后哈希函数将填充后消息作为 n 个 512 位或 1024 位块处理.

4.1. SHA-224 和 SHA-256

假设消息长度为 L < 2^64. 在输入哈希函数之前, 按如下方式在消息右侧进行填充:

a. 追加 "1". 例如, 如果原始消息为 "01010000", 则填充为 "010100001".

b. 追加 K 个 "0", 其中 K 是以下方程的最小非负解:

( L + 1 + K ) mod 512 = 448

c. 然后追加一个 64-bit 块, 该块是 L 的二进制表示. 追加此块后, 消息长度将是 512 bit 的倍数.

示例: 假设原始消息是如下 bit string:

01100001 01100010 01100011 01100100 01100101

步骤 (a) 后得到:

01100001 01100010 01100011 01100100 01100101 1

由于 L = 40, 上述内容的 bit 数为 41, 并追加 K = 407 个 "0", 使总数变为 448. 得到如下十六进制表示:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000

L = 40 的 64-bit 表示是十六进制 00000000 00000028. 因此最终填充后的消息为如下十六进制:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028

4.2. SHA-384 和 SHA-512

假设消息长度为 L < 2^128. 在输入哈希函数之前, 按如下方式在消息右侧进行填充:

a. 追加 "1". 例如, 如果原始消息为 "01010000", 则填充为 "010100001".

b. 追加 K 个 "0", 其中 K 是以下方程的最小非负解:

( L + 1 + K ) mod 1024 = 896

c. 然后追加一个 128-bit 块, 该块是 L 的二进制表示. 追加此块后, 消息长度将是 1024 bit 的倍数.

示例: 假设原始消息是如下 bit string:

01100001 01100010 01100011 01100100 01100101

步骤 (a) 后得到:

01100001 01100010 01100011 01100100 01100101 1

由于 L = 40, 上述内容的 bit 数为 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-bit 表示是十六进制 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