SHA-1算法流程

SHA-1

输入消息:M

输出消息:160位的hash值

步骤:

  1. 消息填充:M的长度 mod 512 = R,考虑R(R为输入消息长度按512bit进行分组后,最后一组的长度):

    • R < 448,在最后一组的末尾填充1个“1”及若干个“0”,使最后一组的位数达到448位;再在这448位的基础上填充64位,这64位是M的原始长度的二进制表示。
      1   0000... ⏟ 448 − R   输 入 消 息 的 长 度 的 二 进 制 ⏟ 64 b i t \underbrace{1\ 0000...}_{448-R}\ \underbrace{输入消息的长度的二进制}_{64bit} 448R 1 0000... 64bit

    • R >= 448,在最后一组的末尾填充1个“1”及若干个“0”,使最后一组位数达到512;再新增一组,添加448个“0”和64位M的原始长度的二进制表示。

    1   00... ⏟ 512 − R 000... ⏟ 448 b i t 输 入 消 息 的 长 度 的 二 进 制 ⏟ 64 b i t ⏟ 512 b i t \underbrace{1\ 00...}_{512-R} \quad \underbrace{\underbrace{000...}_{448bit} \underbrace{输入消息的长度的二进制}_{64bit}}_{512bit} 512R 1 00...512bit 448bit 000...64bit

  2. 系统给出5个寄存器并给出初始值:

    A = 0x67452301,B = 0xEFCDAB89,C = 0x98BADCFE,

    D = 0x10325476,E = 0xC3D2E1F0。

  3. 第一个512位分组进来后,以32位为一组,分别存储在W0 ,……,W15 中,后续
    W t = ( W t − 16 ⊕ W t − 14 ⊕ W t − 8 ⊕ W t − 3 ) < < 1 ( 16 ≤ t ≤ 79 ) W_t = (W_{t-16} \oplus W_{t-14} \oplus W_{t-8} \oplus W_{t-3}) << 1 (16 \leq t \leq 79) Wt=(Wt16Wt14Wt8Wt3)<<1(16t79)
    “<<” 表示循环左移符号,上述中是循环左移1位。

    定义:
    K t = { 0 x 5 a 827999 ( 0 ≤ t ≤ 19 ) 0 x 6 e d 9 e b a 1 ( 20 ≤ t ≤ 39 ) 0 x 8 f 1 b b c d c ( 40 ≤ t ≤ 59 ) 0 x c a 62 c 1 d 4 ( 60 ≤ t ≤ 79 ) K_t = \begin{cases} 0x5a827999 &\text (0≤t≤19) \\ 0x6ed9eba1 &\text (20≤t≤39) \\ 0x8f1bbcdc &\text (40≤t≤59) \\ 0xca62c1d4 &\text (60≤t≤79) \\ \end{cases} Kt=0x5a8279990x6ed9eba10x8f1bbcdc0xca62c1d4(0t19)(20t39)(40t59)(60t79)

    f t ( B , C , D ) = { ( B ∧ C ) ∨ ( B ˉ ∧ D ) ( 0 ≤ t ≤ 19 ) B ⊕ C ⊕ D ( 20 ≤ t ≤ 39 ) ( B ∧ C ) ∨ ( B ∧ D ) ∨ ( C ∧ D ) ( 40 ≤ t ≤ 59 ) B ⊕ C ⊕ D ( 60 ≤ t ≤ 79 ) f_t(B,C,D) = \begin{cases} (B \land C ) \lor (\bar{B} \land D) &\text (0 \leq t \leq 19) \\ B \oplus C \oplus D &\text (20 \leq t \leq 39) \\ (B \land C) \lor (B \land D)\lor (C \land D) &\text (40 \leq t \leq 59) \\ B \oplus C \oplus D &\text (60 \leq t \leq 79) \\ \end{cases} ft(B,C,D)=(BC)(BˉD)BCD(BC)(BD)(CD)BCD(0t19)(20t39)(40t59)(60t79)
    然后,我们就可以进行如下操作:
    t e m p = A A = A < < 5 + f t ( B , C , D ) + E + W t + K t E = D D = C c = B < < 30 m o d 2 32 B = t e m p \begin{aligned} &temp = A \\ &A = A << 5 + f_t(B,C,D)+E+W_t+K_t \\ & E = D \\ & D = C \\ & c = B << 30 mod 2^{32} \\ & B = temp \end{aligned} temp=AA=A<<5+ft(B,C,D)+E+Wt+KtE=DD=Cc=B<<30mod232B=temp
    上述操作执行80轮之后,产生的A、B、C、D、E即为第一个512位分组的输出。

  4. 接着,下一组的512位分组进入,与第一组一样,先按照32位进行分组存储到W0 ,……,W15 中,后续操作与步骤3一样,只是第二组执行第一轮操作时,用到的A、B、C、D、E是第一轮512位分组的输出,而第一组512位分组第一轮用到的A、B、C、D、E是系统给定的数值。

  5. 重复执行步骤4,最后一组的512位分组经过80轮步骤3的操作后,最终产生的A、B、C、D、E即为消息M的hash值。

你可能感兴趣的:(密码学)