§ Essay
爬虫常见加密算法原理(持续更新中)
介绍爬虫开发中常见的 SHA-1、AES、RSA、MD5、Base64 和 DES 算法原理及其应用场景
在爬虫开发过程中,我们经常会遇到参数加密、请求签名、密码摘要以及数据编码等问题。网站通常会通过不同的加密或编码算法保护接口参数、用户信息和通信数据。理解这些算法的基本原理,有助于我们分析请求流程、定位参数生成逻辑。
需要注意的是,SHA-1 和 MD5 属于哈希算法,Base64 属于编码方式,它们并不是严格意义上的加密算法;AES、RSA 和 DES 才属于用于保护数据机密性的加密算法。
一、SHA1 算法
SHA 算法起源
SHA[1] (Security Hash Algorithm) 是美国的 NIST 和 NSA 设计的一种标准的 Hash (哈希)算法,SHA 用于数字签名的标准算法的 DSS 中,也是安全性很高的一种 Hash 算法。
是美国国家标准技术研究所发布的国家标准 FIPS PUB 180,最新的标准已经于 2008 年更新到 FIPS PUB 180‑3。其中规定了 SHA‑1,SHA‑224,SHA‑256,SHA‑384,和 SHA‑512 这几种单向散列算法。SHA‑1,SHA‑224 和 SHA‑256 适用于长度不超过 二进制位的消息。SHA‑384 和 SHA‑512 适用于长度不超过 二进制位的消息。
SHA‑1 算法简介
- 输入:最大的长度为 bit,约等于 2 的 41 次 MB(位)
- 输出:160 位信息摘要
- 处理:输入以 512 位块为单位处理
- 循环次数:对每个分组使用 4 次循环,每次循环 20 步,共 80 步
| 输入内容 | UTF‑8 字节数 | 比特长度 (bit) | 说明 |
|---|---|---|---|
“我”(中文汉字) | 3 字节 | 3×8=24 bit | UTF‑8 下一个汉字占 3 字节 |
123(字符串) | 3 字节 | 3×8=24 bit | 字符'1'、'2'、'3',每个 ASCII 字符 1 字节 |
“a”(英文字母) | 1 字节 | 1×8=8 bit | 标准 ASCII,1 字节 |

SHA-1 算法加密流程
1、消息分割和填充
将明文数据分割为 n 个 512 位明文数据块,最后一组数据要求长度为 448 位,最后剩下 64 位数据,用来记录报文长度位。
补位规则:第一个数据补1,后面全部补0,直至满足 L mod 512 = 448:

举个例子:
-
输入:“abc”
-
将输入的字符串转化为 bit 串:01100001 01100010 01100011
-
补位第一步:后面加一位 1
-
后面补 0 :加足够位数的 0
要补多少 0 呢?
字符串“abc”转化成比特位 01100001 01100010 01100011 后一共有24位
最后的 64 位数据需要记录长度,即 000 ······ 00011000 (即 24)
那么还需要补齐 512 - 64(长度位) - 24(原本的的比特位长度) - 1(补的 1 占 1 位) = 423 位
如图所示:

2、每个 512bit 数据的运算——消息字扩充

将 512 位的数据分为 16 份 32bit 的数据,用 M[t] 表示:
“扩充”:将 16 份 32bit 数据扩充成 80 份 32bit,得到W[t]:
“扩充”公式:
其中符号 表示左移一位,其余符号见下表:
| 符号 | 含义 |
|---|---|
| ∧ | 按位与 Bitwise AND operation |
| ∨ | 按位或 Bitwise OR (“inclusive‑OR”) operation |
| ⊕ | 按位异或 Bitwise XOR (“exclusive‑OR”) operation |
| ¬ | 按位取反 Bitwise complement operation |
| + | 模 232 加法 Addition modulo 232 |
| ≪ | 左移 Left‑shift operation |
| ≫ | 右移 Right‑shift operation |
3、SHA‑1 加密过程——循环压缩运算
将 80 份的明文分组都参与到 80 轮的运算中(4 轮运算,每个运算 20 个步骤)
准备初始缓存区值(初始哈希向量)
将缓存赋值给 a,b,c,d,e 五个 32 位变量:
80 轮迭代循环 For t = 0 to 79
T = ROTL⁵(a) + f_t(b,c,d) + e + K_t + W_t
e = d
d = c
c = ROTL³⁰(b)
b = a
a = T
执行 80 次循环
ROTL⁵(a):将 a 循环左移 5 位
ROTL³⁰(b):b 循环左移 30 位
f_t(b,c,d)、K_t如下表所示
fₜ (b,c,d) 逻辑函数
K_t 固定常量
分组结束处理
一轮 512bit 分组的 80 轮运算完成后,把得到的 a,b,c,d,e 和本组初始缓存 分别做模 加法,得到新的缓存 ,作为下一个 512 bit 分组运算的初始值。
全部分组处理完毕后,拼接,得到最终 160bit SHA‑1 摘要。
二、AES 加密算法
AES 算法起源
AES [2](Advanced Encryption Standard),又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月 26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。2006 年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES 算法简介
- 输入:AES 属于分组加密算法,明文长度固定为 128 位; 密钥长度可以是 128、192、256 位。即128 位明文 +(128/192/256 位)密钥
- 输出:128 位密文

明文和密文数据转换
128 位(16 字节)的明文 / 密文,需要转换为4×4 状态矩阵(State)。
输入的字节顺序:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
按列优先的方式填入 4×4 矩阵,字节按一列一列向下填充,先填完第 1 列,再填第 2 列,依次类推。输出密文时,同样按列优先从矩阵还原回 16 字节序列:

AES 算法加密过程
AES 算法完整全局流程图
完整 AES 加密全过程:

AES 算法完整局部流程图
“初始变换”这一步的数据流向:

加密第一步:初始置换
将明文和秘钥进行异或操作得到初始变換的结果:

第二步:九轮循环运算
1.字节代换
将输出的数据通过 s 表进行替换:

替换完之后:

2.行位移

移位之后的结果:

3.列混合
将输入的 4*4 的矩阵左乘一个给定的 4 *4 矩阵:

得到最终相乘的结果:

4.轮秘钥加
三、RSA 非对称加密算法
四、MD5 加密算法
五、Base64 编码
六、DES 加密算法
参考资料
[1].FIPS 180-2, Secure Hash Standard (superseded Feb. 25, 2004)