# 基础

  1. 输入最大消息长度:2642^{64} bits
  2. 输出:256 bits
  3. 大端 (Big endian) 为主
  4. word = 32 bits;
  5. block = 512 bit, 16 words;

# 位操作符号

w = length of word.

  1. SHR 右移
  2. ROTR 循环右移
  3. ROTL 循环左移
SHR^n(x) = x>>n
ROTR^n(x) = (x>>n) OR (x<<(w-n))
ROTL^n(x) = (x<<n) OR (x>>(w-n))
ROTL^n(x) = ROTR^(w-n)(x)
ROTR^n(x) = ROTL^(w-n)(x)

# 填充

  1. 原长度 L
  2. 填充 1
  3. 填充 K 个 0:L + 1 + K = 448 (mod 512)
  4. 结尾 64 bits 作为原长度的二进制表示。因此决定输入消息的长度。

# 函数

CH( x, y, z) = (x AND y) XOR ( (NOT x) AND z)
MAJ( x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)
BSIG0(x) = ROTR^2(x) XOR ROTR^13(x) XOR ROTR^22(x)
BSIG1(x) = ROTR^6(x) XOR ROTR^11(x) XOR ROTR^25(x)
SSIG0(x) = ROTR^7(x) XOR ROTR^18(x) XOR SHR^3(x)
SSIG1(x) = ROTR^17(x) XOR ROTR^19(x) XOR SHR^10(x)

# 常量

64 个 32 位常量:K0,K1,...,K63K0, K1, ..., K63

前 64 个素数的立方根的双精度浮点数小数部分的前 32 位的 16 进制

例如:

  1. cube root(2) = 1.25992104989
  2. 双精度浮点数,符号位(1)+ 指数(11)+ 小数(52)
0 01111111111
0100 0010 1000 1010 0010 1111 1001 1000
11010001110011010000
  1. 前 32 位的 16 进制表达
0100 0010 1000 1010 0010 1111 1001 1000
4 2 8 a 2 f 9 8
428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2

# 最终输出

+ 为字符串拼接

H(N) = H(N)0 + H(N)1 + ... + H(N)7

# 初始化

前 8 个素数的平方根的双精度浮点数小数部分的前 32 位的 16 进制

和前面类似,不过是平方根。
例如:

  1. square root(2) = 1.41421356237
  2. 二进制
0 01111111111
0110 1010 0000 1001 1110 0110 0110 0111
11110000010101011010
  1. 十六进制
0110 1010 0000 1001 1110 0110 0110 0111
6 a 0 9 e 6 6 7
H(0)0 = 6a09e667
H(0)1 = bb67ae85
H(0)2 = 3c6ef372
H(0)3 = a54ff53a
H(0)4 = 510e527f
H(0)5 = 9b05688c
H(0)6 = 1f83d9ab
H(0)7 = 5be0cd19

# 处理

For i = 1 to N
    1. Prepare the message schedule W:
        For t = 0 to 15
            Wt = M(i)t
        For t = 16 to 63
            Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(t-15) + W(t-16)
    2. Initialize the working variables:
        a = H(i-1)0
        b = H(i-1)1
        c = H(i-1)2
        d = H(i-1)3
        e = H(i-1)4
        f = H(i-1)5
        g = H(i-1)6
        h = H(i-1)7
    3. Perform the main hash computation:
        For t = 0 to 63
            T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt
            T2 = BSIG0(a) + MAJ(a,b,c)
            h = g
            g = f
            f = e
            e = d + T1
            d = c
            c = b
            b = a
            a = T1 + T2
    4. Compute the intermediate hash value H(i):
        H(i)0 = a + H(i-1)0
        H(i)1 = b + H(i-1)1
        H(i)2 = c + H(i-1)2
        H(i)3 = d + H(i-1)3
        H(i)4 = e + H(i-1)4
        H(i)5 = f + H(i-1)5
        H(i)6 = g + H(i-1)6
        H(i)7 = h + H(i-1)7
最后输出 H(N),i -> N 轮
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Cecil 微信支付

微信支付

Cecil 支付宝

支付宝

Cecil PayPal

PayPal