0%

SHA-512算法2-轮函数计算

SHA-512的轮函数计算,哈希函数是支撑单向性最重要的步骤,80轮计算是否可逆我不是很清楚,因为在我的脑子里所有关系式最终可以变成y=f(x),只不过有可能是离散的,有可能是连续的.

1. 基本步骤

2. 辅助公式

$W_t$字的计算说明了第一个式子中的$W_t$的计算。

  • $\sigma_{0}^{512}$的计算

    1
    2
    3
    4
    /* SIGMA0 */
    uint64_t SIGMA0(uint64_t x) {
    return ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39);
    }
  • $\sigma_{1}^{512}$的计算

    1
    2
    3
    4
    /* SIGMA1 */
    uint64_t SIGMA1(uint64_t x) {
    return ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41);
    }
  • Ch函数的实现

    1
    2
    3
    4
    /* Ch ... choose */
    uint64_t Ch(uint64_t x, uint64_t y, uint64_t z) {
    return (x & y) ^ (~x & z) ;
    }
  • Maj函数的实现

    1
    2
    3
    4
    /* Maj ... majority */
    uint64_t Maj(uint64_t x, uint64_t y, uint64_t z) {
    return (x & y) ^ (x & z) ^ (y & z);
    }

3. 轮函数计算

这里说明一下K512常数数组的来源: 对自然数前80个素数开立方根,取小数部分的前64位。(备注:轮函数计算是80次)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define SHA512_ROUND_NUM    80
#define HASH_ROUND_NUM SHA512_ROUND_NUM

for (t=0; t<HASH_ROUND_NUM; t++) {
T1 = h + SIGMA1(e) + Ch(e, f, g) + K512[t] + W[t];
T2 = SIGMA0(a) + Maj(a, b, c);
h = g;
g = f;
f = e;
e = d + T1;
d = c;
c = b;
b = a;
a = T1 + T2;
}