SHA1步骤详解及C++实现
1.步骤详解
操作
一个字就是32位的二进制字符串,介于 0 0 0与 2 3 2 − 1 2^32-1 232−1之间的整数可以表示为一个字。
X和Y分别为一个字
- X AND Y = X和Y按位与
- X OR Y = X和Y按位或
- X XOR Y = X和Y按位异或
- NOT X = X取非
- X+Y = X+Y后的结果模 2 32 2^{32} 232
- S^n(X) = X循环左移n位
第一步:将字符串转换为ASCII码的二进制串
第二步:消息填充
填充规则:
- 在原始明文消息后补100…0,直到满足总长度 ≡ 448 m o d 512 \equiv448 \mathrm{mod }512 ≡448mod512为止。
- 设原始明文消息的长度为 L b i t L \ \mathrm{ bit} L bit,将 L L L表示为64位二进制串的形式,添加在最后。
经过上面两个步骤的处理,最终得到的处理后的数据如下图所示:
第三步:计算消息摘要
将数据按512比特一块进行分块,得到n块数据,记作 M ( 1 ) , M ( 2 ) , ⋯ , M ( n ) M(1),M(2),\cdots,M(n) M(1),M(2),⋯,M(n).
一些操作和常量如下
对于整数t,和三个32位字B,C,D,有
if(0 <= t <= 19) f(t,B,C,D) = (B AND C) OR ((NOT B) AND D) if(20 <= t <= 39) f(t;B,C,D) = B XOR C XOR D if(40 <= t &l