0%

SHA-512算法1-$W_t$字的计算

构成比特币的三个核心技术是非对称加密,P2P网络以及哈希算法,我对哈希算法的单向性很感兴趣,这些笔记是对实现SHA-512期间的笔记做一下记录;$W_t$字的计算是轮函数一次要计算80次,每次都要用到的。

1. 实现原理

2. 算法注释

  • 2.1 简单的移位操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 循环右移动n位
    /* ROTate Right (cirular right shift) */
    uint64_t ROTR(uint64_t x, uint8_t shift) {
    return (x >> shift) | (x << (64 - shift));
    }

    // 循环右移空出来的部分用0补充.
    /* Right SHift */
    uint64_t SHR(uint64_t x, uint8_t shift) {
    return (x >> shift);
    }
  • $\sigma_0^{512}(x)$的实现

    1
    2
    3
    4
    /* sigma0, different from SIGMA0 */
    uint64_t sigma0(uint64_t x) {
    return ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7);
    }
  • $\sigma_1^{512}(x)$的实现

    1
    2
    3
    4
    /* sigma1, different from SIGMA1 */
    uint64_t sigma1(uint64_t x) {
    return ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6);
    }

3. 最终计算$W_t$的值

和SHA-256的区别是这里是64位值的计算,256的是32位值计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define SHA512_ROUND_NUM    80
#define HASH_ROUND_NUM SHA512_ROUND_NUM

int SHA512_PrepareScheduleWord(const uint64_t *block, uint64_t *W) {
uint32_t t;

if ((NULL == block) || (NULL == W)) {
return ERR_INV_PARAM;
}

for (t=0; t<HASH_ROUND_NUM; t++) {
if (t<=15) /* 0 <= t <= 15 */
// 直接复制前15个值(https://linux.die.net/man/3/be64toh)
W[t] = be64toh(block[t]);
else /* 16 <= t <= 79 */
// 这是第一节的公式
W[t] = sigma1(W[t-2]) + W[t-7] + sigma0(W[t-15]) + W[t-16];
}

return ERR_OK;
}