Redis源码中探秘SHA-1算法原理及其编程实现(四)

2015-11-21 01:34:57 · 作者: · 浏览: 11
着定义了结构体类型CHAR64LONG,并声明了一个该类型的指针变量block(实际是数组实现),前面有介绍。然后:
memcpy(block, buffer, 64);
将参数buffer里面的字节复制到block中。
    a = state[0];
    b = state[1];
    c = state[2];
    d = state[3];
    e = state[4];
实际上完成的就是RFC文档中的H0~H4赋值给ABCDE的操作。接下来就是80轮运算的代码。每20轮为一组,共分四组。
    R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
    R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
    R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
    R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
    R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
    ...
第一组比较特殊,使用了R0和R1两个宏函数,其原因前面已经介绍了。因为第0~15轮运算和16~79轮运算的时候消息块M(i)和字块W(i)的转换是不一样的。后面的20~39轮,40~59轮,60~79轮就是依次使用的R2,R3,R4来运算了,比较好理解,就不表了。接着:
    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;
    state[4] += e;
    /* Wipe variables */
    a = b = c = d = e = 0;
完成的就是更新缓冲区H0~H4的内容。然后把a~e清空为0(这一步我感觉意义不到,本身就是栈存储的5个变量,函数结束后就释放了啊)。 最后state[0]~state[4]中存储的就是SHA-1算法的生成的消息摘要。