Secure Hash Algorithm
1. 概述
当输入的消息长度小于2^64 bits时,SHA-1输出160-bit的消息摘要。
2. 定义
a. A hex digit: 集合{0, 1, … , 9, A, … , F}中的一个元素
A hex digit 是4-bit字符串的描述。例如:7 = 0111
b. A word 是 32-bit字符串(8 hex digit)。
例如:1010 0001 0000 0011 1111 1110 0010 0011 = A103FE23
c. 0和2^32 - 1之间的整数可以表示为一个单词。
整数的最低有效四位由单词表示的最右边的十六进制数字表示。
示例:整数291 = 2^8 + 2^5 + 2^1 + 2^0 = 256 + 32 + 2 + 1 由十六进制字 00000123 表示。
d. block = 512-bit 字符串.
3. 字(Words)的操作
a. 按位逻辑运算
X AND Y = 按位逻辑与
X OR Y = 按位逻辑或
X XOR Y = 按位逻辑异或
NOT X = 按位逻辑非
b. 定义X + Y
z = (x + y) mod 2^32.
Then 0 <= z < 2^32. Convert z to a word, Z, and define Z = X + Y.
c. 循环左移操作
S^n(X) = (X << n) OR (X >> 32-n)
在上面,X << n的获得如下:丢弃X的最左边n位,然后在右边填充n个零(结果仍然是32位)。 X >> n是通过丢弃X的最右边的n位然后用左边的n个零填充结果而获得的。 因此S ^ n(X)相当于X左移n个位置的循环移位。
4. 消息填充
SHA-1用于计算作为输入提供的消息或数据文件的消息摘要。消息或数据文件应该被认为是位串。消息的长度是消息中的比特数(空消息的长度为0)。如果消息中的比特数为8的倍数,那么我们就可以用十六进制表示该消息。消息填充的目的是使padd消息的总长度为512。在计算消息摘要时,SHA-1顺序处理512位的块。下面指定如何执行此填充。综上所述,“1”后面跟着的是m“0”,后面是一个64位整数,以生成长度为512 * n的padd消息。64位整数是原始消息的长度。然后,由SHA-1作为n 512位块处理padd消息。
例如:
原消息:
01100001 01100010 01100011 01100100 01100101
填充1
01100001 01100010 01100011 01100100 01100101 1
填充0(现在长度为448)
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
最后,原消息长度length = 40, 最后64位填充原消息长度。(448 + 64 = 512)
61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028
填充后的消息将包含16 * n个单词,用于某些n > 0。
填充后的消息被认为是一个n块M(1)、M(2)、第一个字符(或bits)信息的序列。
5. 函数和常量
SHA-1使用一系列的逻辑函数f(0), f(1),…, f(79),操作三个32-bit字 B, C, D,并且生成一个32-bit字。
f(t;B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
f(t;B,C,D) = B XOR C XOR D (20 <= t <= 39)
f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59)
f(t;B,C,D) = B XOR C XOR D (60 <= t <= 79).
一系列的常量K(0), K(1), … , K(79):
K(t) = 5A827999 ( 0 <= t <= 19)
K(t) = 6ED9EBA1 (20 <= t <= 39)
K(t) = 8F1BBCDC (40 <= t <= 59)
K(t) = CA62C1D6 (60 <= t <= 79)
6. 计算消息摘要
下面的6.1和6.2中给出的方法产生了相同的消息摘要。虽然使用方法2可以节省64个32-bit的存储,但由于在步骤(c)中,地址计算的复杂性增加,它很可能会延长执行时间。
6.1 方法一
消息摘要是使用第4节中描述的消息填充来计算的。计算过程用两个缓冲区
来描述,每个缓冲区包含5个32-bit
的words和一个80个32-bit words的序列
。第一个5字缓冲区的words被标记为A、B、C、D、E
。第二个5字缓冲区的words标记为H0, H1, H2, H3, H4
。80字序列的words为W(0)、W(1)、… W(79)
。还使用了a single word buffer TEMP。
为了生成消息摘要,16-word blocks M(1)、M(2)、…在第4节中定义的M(n)是按顺序处理的。每个M(i)的处理涉及80个步骤。
以十六进制初始化 H :
H0 = 67452301
H1 = EFCDAB89
H2 = 98BADCFE
H3 = 10325476
H4 = C3D2E1F0
根据以下步骤处理 M(i):
a. 把 M(i) 分为 16 个字 W(0), W(1), ... , W(15),W(0)在最左边。
b. 对于 t = 16 ~ 79,
W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16))
c. A = H0, B = H1, C = H2, D = H3, E = H4
d. 对于 t = 0 ~ 79,
TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);
E = D;
D = C;
C = S^30(B);
B = A;
A = TEMP;
e. H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E
在处理完 M(n) 后,消息摘要是160-bit的字符串,表示为5个字:
H0 H1 H2 H3 H4
6.2 方法二
参考:RFC 3174 [ US Secure Hash Algorithm 1 (SHA1) ]