# 基础
- 输入最大消息长度:264 bits
- 输出:256 bits
- 大端 (Big endian) 为主
- word = 32 bits;
- block = 512 bit, 16 words;
# 位操作符号
w = length of word.
- SHR 右移
- ROTR 循环右移
- 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) |
# 填充
- 原长度 L
- 填充 1
- 填充 K 个 0:L + 1 + K = 448 (mod 512)
- 结尾 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,...,K63
前 64 个素数的立方根的双精度浮点数小数部分的前 32 位的 16 进制
例如:
- cube root(2) = 1.25992104989
- 双精度浮点数,符号位(1)+ 指数(11)+ 小数(52)
| 0 01111111111 |
| 0100 0010 1000 1010 0010 1111 1001 1000 |
| 11010001110011010000 |
- 前 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 进制
和前面类似,不过是平方根。
例如:
- square root(2) = 1.41421356237
- 二进制
| 0 01111111111 |
| 0110 1010 0000 1001 1110 0110 0110 0111 |
| 11110000010101011010 |
- 十六进制
| 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 轮 |