SHA1算法

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) ]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值