密码学基础
基本术语
- 加密(Encryption)-解密(Decryption)
- 密码体制(Crypto System)
- 明文(Plaintext)-密文(Ciphertext)
- 加密算法(Encryption Alogorithm)
- 无密钥密码(Keyless Cipher)
- $C=E(P)$
- $P=D(C)$
- 对称(Symmetric)加密
- $C=E(K,P)$
- $P=D(K,C)$
- 非对称(Asymmetric)加密
- $C=E(K_E,P)$
- $P=D(K_D,C)$
![[images/Pasted image 20251203173556.png]]
古典加密方法
替换法(Substitution)
凯撒加密(Caesar Cipher)
按照字母表顺序前移或后移
$$
C_i=E(P_i)=(P_i+n)\ \text{mod}\ 26
$$
$n$ 可以为任意整数
破译点:
- 空格、重复字母
- 常用前缀、后缀,单词结构的分析
有密钥的替换密码
![[images/Pasted image 20251203174218.png]]
算法特点:
- 采用密钥
- 没有空格字母特征
- 没有破坏重复结构、单词结构
一次一密乱码本
弗纳姆密码
结合以下两种实现方式:
- 长随机数序列(随机密钥)
- 弗纳姆密码(Vernam Cipher)
![[images/Pasted image 20251203174416.png]]
弗纳姆密码实例:
![[images/Pasted image 20251203174504.png]]
维吉尼亚密码
- 随机密钥密码本
- 维吉尼亚表(Vigenere)
加密过程:
- 明文:行选择器
- 密钥:列选择器
- 密文:表中的值
维吉尼亚表:
- 表格的第一行(或第一列)是标准的英文字母表:
A B C D ... Z - 每一行都是前一行向左循环移位一位的结果:
- 第 0 行(A 行):A B C D E … Z
- 第 1 行(B 行):B C D E F … A
- 第 2 行(C 行):C D E F G … B
- …
- 第 25 行(Z 行):Z A B C D … Y
这个表格本质上包含了 26 个凯撒密码表,每个对应一个偏移量(0 到 25)。
- 加密算法:$C_i=(P_i+K_i)\ \text{mod}\ 26$
- 解密算法:$P_i=(C_i-K_i+26)\ \text{mod}\ 26$
置换法(Transposition)
简单列置换算法
- 加密:行入列出
- 解密:列入行出
加密过程:
- 选择一个密钥(通常是一个单词或数字序列),用于确定列的顺序,相同字母保留最左边。
- 将明文按行写入一个固定列数的表格中(列数 = 密钥长度)。
- 如果明文长度不能整除列数,则在末尾填充占位符(如
X或空格)。 - 按照密钥指定的列顺序读取列,拼接得到密文。
- 列顺序由密钥排序后得到映射
可通过字母组分析进行破译:
![[images/Pasted image 20251203175332.png]]
私钥加密算法(对称加密)
安全的加密算法取决于:
- 可靠的数学基础
- 被证实是可靠的
- 经过时间检验
- 商业流行算法:DES、AES、RSA
特性:
- 混乱性(Confusion)
- 扩散性(Diffusion)
流密码和块密码(分组密码)
![[images/Pasted image 20251203181014.png]]
| 比较维度 | 流密码(Stream Cipher) | 块密码(Block Cipher) |
|---|---|---|
| 基本原理 | 逐位(或逐字节)加密明文,使用密钥流与明文进行异或(XOR)等操作。 | 将明文划分为固定长度的块(如 64 位、128 位),对每个块整体加密。 |
| 加密单位 | 比特(bit)或字节(byte) | 固定大小的数据块(如 AES:128 位) |
| 密钥流生成 | 通常由伪随机数生成器(PRNG)基于密钥和初始向量(IV)生成。 | 每个块使用相同的密钥,但可通过不同模式(如 CBC、CTR)引入变化。 |
| 典型算法 | RC4、ChaCha20、Salsa20、A5/1(GSM) | AES、DES、3DES、Blowfish、SM4 |
| 加密速度 | 快,适合实时通信(如音视频流) | 相对较慢(尤其在软件实现中),但现代硬件加速后性能优异 |
| 内存/资源需求 | 低,适合嵌入式设备、物联网(IoT) | 较高(需缓存整个数据块) |
| 错误传播 | 无错误传播:1 位传输错误只影响对应明文位 | 取决于工作模式: - ECB/CBC:错误可能扩散到整块或多块 - CTR:类似流密码,无扩散 |
| 并行处理能力 | 通常不能并行加密(密钥流依赖前序状态) (但 ChaCha20 等可并行) |
多数模式(如 ECB、CTR)支持并行加密/解密 |
| 安全性依赖 | 密钥流的不可预测性和不重复使用(重用密钥流=灾难) | 密钥强度、块大小、工作模式选择 |
| 主要优点 | - 转换速度快:每个字符(字节)都可以一读取就加密,加密一个字符(字节)的时间只依赖于加密算法本身,而不是接受明文的时间 - 低错误扩散率:每个字符(字节)都是单独编码,加密过程中的错误只影响对应的字符(字节) |
- 高扩散性:明文的信息被扩散到了几个密文符号中;一个密文分组可能依赖于几个明文字母 - 无法插入符号:符号按组加密,不可能把一个单独的符号插入到一个分组 |
| 主要缺点 | - 密钥流重用会导致严重漏洞(如 WEP 破解) - 难以认证完整性(需额外机制) - 低扩散性:每个字符(字节)都是单独加密,该字符(字节)的所有信息都包含在密文的一个对应字符(字节) - 易被恶意插入和篡改:每个字符(字节)都是单独加密的,截取者可以拼接报文,伪造可信的新报文 |
- 需填充(若明文非整块) - 某些模式(如 ECB)会暴露数据模式 - 加密较慢,实时性较差 - 错误扩散:一个错误会影响到同一分组中其他字符的转换 |
| 典型应用场景 | - 无线通信(蓝牙、Wi-Fi WPA-TKIP) - TLS 中的 ChaCha20 - 军事/卫星通信 |
- 文件/磁盘加密(BitLocker, VeraCrypt) - TLS/AES - 数据库存储加密 - 区块链 |
DES(Data Encryption Standard)
| 属性 | 值 |
|---|---|
| 明文分组长度 | 64 位 |
| 密钥长度 | 64 位(实际有效密钥为 56 位,其余 8 位为奇偶校验位) |
| 密文分组长度 | 64 位 |
| 加密轮数 | 16 轮(Feistel 结构) |
| 算法类型 | 对称加密、分组密码、Feistel 网络 |
DES 采用 Feistel 结构:
明文(64位)
↓
[初始置换 IP]
↓
(L₀, R₀) ← 将64位分为左右两半,各32位
↓
16轮 Feistel 迭代(每轮使用一个子密钥 Kᵢ)
↓
(R₁₆, L₁₆) ← 注意:最后一轮后左右不交换!
↓
[逆初始置换 IP⁻¹]
↓
密文(64位)
![[images/Pasted image 20251203182540.png]]
加密步骤
![[images/Pasted image 20251203182706.png]]
初始置换 (Initial Permutation, IP)
- 对 64 位明文进行固定位置重排(查 IP 表),无密钥参与。
- 目的:打乱输入位顺序,增强扩散性。
- 输出仍为 64 位,分为左半部分 L0 和右半部分 R0(各 32 位)。
16 轮 Feistel 迭代
每一轮 i(i=1 到 16)执行以下操作:
Lᵢ = Rᵢ₋₁
Rᵢ = Lᵢ₋₁ ⊕ F(Rᵢ₋₁, Kᵢ)
其中:
- $L_{i−1},R_{i−1}$:上一轮的左右半区
- $K_i$ :第 $i$ 轮的 48 位子密钥
- $F$:轮函数(Feistel Function)
最终交换与逆初始置换
- 16 轮结束后,得到 $L_{16},R_{16}$。
- 注意:Feistel 结构通常在最后一轮不交换左右,因此拼接时为 $(R_{16},L_{16})$。
- 对这 64 位进行 逆初始置换 IP⁻¹(IP 的逆操作),得到最终 64 位密文。
将子密钥顺序倒过来使用即为解密过程
轮函数
- 扩展置换 E(Expansion)
- 将 32 位 Ri−1 扩展为 48 位(通过重复某些位,查 E 表)。
- 目的:使输入与 48 位子密钥可进行异或。
- 与子密钥异或
- $E(R_{i−1})⊕K_i$ → 得到 48 位结果。
- S 盒替换(Substitution Boxes, S-boxes)
- 将 48 位分为 8 组,每组 6 位 → 共 8 个 S 盒(S1~S8)。
- 每个 6 位输入 → 通过 S 盒查表 → 输出 4 位 → 共输出 32 位。
- S 盒是非线性核心,提供混淆(confusion),抵抗线性/差分分析。
- P 盒置换(Permutation)
- 对 32 位 S 盒输出进行固定位置重排(查 P 表),实现扩散(diffusion):使每一位影响下一轮多个位置。
AES(Advanced Encryption Standard)
- 字节替换、行移位、列混合
- 加子密钥
- $k_i=\omega_1\omega_2\omega_3\omega_4$
- $k_{i+1}=\omega_1’(\omega _2 \oplus \omega1’)(\omega _3 \oplus \omega_1’)(\omega _4 \oplus \omega_1’)$;$\omega_1’=\omega_1 << 8 \oplus C$
- 分块大小:128 位
- 密钥长度:128、192、256 位
- 循环次数:9、11、13 次
- 混淆(Confusion):使密钥与密文之间的关系尽可能复杂(通过 S 盒 实现代换)。
- 扩散(Diffusion):使明文每一位的变化影响密文中多个位(通过 行移位 + 列混合 实现)。
AES 将 128 位(16 字节)明文组织为一个 4×4 的字节矩阵,称为 State:
明文:b₀ b₁ b₂ ... b₁₅
State 矩阵(按列填充):
[ b₀ b₄ b₈ b₁₂ ]
[ b₁ b₅ b₉ b₁₃ ]
[ b₂ b₆ b₁₀ b₁₄ ]
[ b₃ b₇ b₁₁ b₁₅ ]
所有操作都在这个 State 上进行。
以 AES-128 为例
AES 加密 = 初始轮 + 主轮(9 轮) + 最终轮(第 10 轮)
明文 → AddRoundKey(轮密钥0)
↓
[Round 1 to 9]:
SubBytes → ShiftRows → MixColumns → AddRoundKey
↓
[Final Round 10]:
SubBytes → ShiftRows → AddRoundKey
↓
密文
最后一轮省略 MixColumns
密钥扩展
- 输入:128/192/256 位主密钥
- 输出:轮密钥序列(共 11/13/15 个 128 位密钥,对应 10/12/14 轮 + 初始轮)
- 过程:
- 将主密钥划分为 4/6/8 个 32 位字(word)
- 通过递推公式生成新字:
- 每第 4 个字(对 AES-128)会经过 RotWord → SubWord → XOR 轮常量(Rcon)
- 每 4 个连续字组成一个轮密钥
解密过程
AES 解密 ≠ 加密的简单逆序,而是使用逆操作
| 加密操作 | 解密操作 |
|---|---|
| SubBytes | InvSubBytes |
| ShiftRows | InvShiftRows(右移) |
| MixColumns | InvMixColumns |
| AddRoundKey | AddRoundKey(XOR 自反) |
密文 → AddRoundKey(K₁₀)
↓
InvShiftRows → InvSubBytes → AddRoundKey(K₉)
↓
InvMixColumns → InvShiftRows → InvSubBytes → AddRoundKey(K₈)
↓
...(重复)
↓
InvMixColumns → InvShiftRows → InvSubBytes → AddRoundKey(K₀)
↓
明文
工作模式
AES 本身只加密单个 128 位块。为加密任意长度数据,需配合工作模式:
| 模式 | 特点 | 是否需要 IV | 并行 | 认证 |
|---|---|---|---|---|
| ECB | 简单但不安全(相同明文 → 相同密文) | 否 | 是 | 否 |
| CBC | 常用,需填充,错误传播 | 是 | 否(加密) | 否 |
| CTR | 将块密码转为流密码,无需填充 | 是(nonce) | 是 | 否 |
| GCM | 推荐! 提供加密+认证(AEAD) | 是 | 是 | 是 |
| CCM | 类似 GCM,但结构不同 | 是 | 否 | 是 |
公钥加密算法(非对称加密)
公钥加密(Public-Key Cryptography),又称非对称加密(Asymmetric Cryptography),是现代密码学的一项革命性突破。它解决了对称加密中密钥分发困难的核心问题,并为数字签名、身份认证、安全通信等奠定了基础
核心思想
公钥加密使用一对数学上相关但功能不同的密钥:
| 密钥类型 | 作用 | 是否公开 |
|---|---|---|
| 公钥(Public Key) | 用于加密或验证签名 | 可公开给任何人 |
| 私钥(Private Key) | 用于解密或生成签名 | 必须严格保密 |
对比对称加密
| 特性 | 对称加密(如 AES) | 非对称加密(如 RSA) |
|---|---|---|
| 密钥数量 | 1 个(双方共享) | 2 个(公钥 + 私钥) |
| 密钥保护 | 必须保护 | 公钥公开;私钥不可公开 |
| 密钥分发 | 困难(需安全通道) | 容易(公钥可公开) |
| 加密速度 | 快(适合大数据) | 慢(适合小数据或密钥交换) |
| 主要用途 | 数据加密 | 密钥交换、数字签名、身份认证 |
| 典型算法 | AES, DES, ChaCha20 | RSA, ECC, ElGamal, DH |
工作流程
假设 Alice 想安全地发送消息给 Bob:
- Bob 生成密钥对:
- 私钥 skB(自己保管)
- 公钥 pkB(发布到网络、证书等)
- Alice 获取 Bob 的公钥 pkB(从可信来源)
- Alice 用 pkB 加密消息 M:
$$C=Encrypt(pk_B,M)$$ - Alice 发送密文 C 给 Bob
- Bob 用自己的私钥 skB 解密:
$$M=Decrypt(sk_B,C)$$
RSA 加密算法
RSA(Rivest–Shamir–Adleman)是第一个实用的公钥加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年提出。它基于大整数分解难题,广泛用于加密、数字签名和密钥交换,是现代信息安全的基石之一。
核心思想
将两个大质数相乘很容易,但将它们的乘积分解回原始质数极其困难(当数字足够大时)
利用这一“单向性”,RSA 构造了一对密钥:
- 公钥(Public Key):用于加密或验证签名(可公开)
- 私钥(Private Key):用于解密或生成签名(必须保密)
密钥生成流程
选择两个大质数
随机选择两个大素数 $p$ 和 $q$(通常为 1024 位或 2048 位)。
示例(教学用小数):
$p=61, q=53$
计算模数 n
$$n=p\times q$$
- $n$ 是公钥和私钥的一部分,也称为模数(modulus)。
- 加密/解密都在模 $n$ 下进行。
示例:$n=61×53=3233$
计算欧拉函数 ϕ(n)
$$ϕ(n)=(p−1)(q−1)$$
- $ϕ(n)$ 表示小于 $n$ 且与 $n$ 互质的正整数个数。
示例:$ϕ(3233)=60×52=3120$
选择公钥指数 e
选择一个整数 $e$,满足:
- $1<e<ϕ(n)$
- $gcd(e,ϕ(n))=1$(即 $e$ 与 $ϕ(n)$ 互质)
常用值:e=65537(= 216+1),因其二进制含少量 1,加速加密。
示例:选 e=17(因为 gcd(17,3120)=1)
公钥 = (e,n) → 可公开发布
计算私钥指数 d
求 $d$ 使得:
$$d⋅e≡1(mod\ ϕ(n))$$
即 $d$ 是 $e$ 在模 $ϕ(n)$ 下的乘法逆元。
使用扩展欧几里得算法求解。
示例:解 $17d≡1(mod\ 3120)$ → d=2753(因为 17×2753=46801=15×3120+1)
私钥 = (d,n) → 必须严格保密
实际中私钥常存储为 $(d,p,q)$ 等形式,便于使用中国剩余定理(CRT)加速解密
加密与解密
- 保密性转换:用接受者的公钥加密,接受者用自己的私钥解密
- 真实性转换:用发送者的私钥加密,接受者用发送者的公钥解密
密码分析学:破译加密体系
已知信息-破译方法:
- 仅有密文
- 唯密文攻击(Ciphertext-only Attack)
- 全部或部分明文
- 已知明文(Known Plaintext)攻击
- 可能明文(Probable Plaintext)攻击
- 任意明文的对应密文
- 选择明文(Chosen Plaintext)攻击
- 算法和密文
- 选择明文(Chosen Plaintext)攻击
- 缺陷
加密应用
Hash 函数
密码哈希(Hash)函数(散列函数)
- Hash 函数是把可变长输入数据(消息)转换成固定长度输出数据的一种函数。
- 这个定长的输出数据称为输入数据的消息摘要,也称为该消息的 Hash 值、散列值、特征值或者数字指纹。
- 确认信息(文件、报文)的完整性。
- 该函数必须依赖于被密封消息的所有位,这样,消息的每一位的变化都会影响到该消息的 Hash 值。
- 使用最广的 Hash 函数:MD4(138 位)、MD5(138 位)和 SHA/sHS(SecureHash Algorithm/Standard,16O 位/汉 56 位/384 位/512 位)
特征
- 快速性:已知 $m$,计算 $c=Hash(m)$ 是容易的
- 单向性:从 Hash 值倒推原文是困难的,即已知 $c=Hash(m)$,求 $m$ 是困难的
- 抗碰撞性:已知 $Hash(m_1)=c$,构造 $Hash(m_2)=c$ 中的 $m_2$ 是困难的
- 雪崩性:$c$ 的每一位都与 $m$ 的每一位有关,并有高度的敏感性,改变 $m$ 的任意一位都会对 $c$ 产生影响
- 固定长度的输出:接受的输入数据没有长度限制,对输入任何长度的数据都能产生固定长度的输出
密钥交换
应用场合:
- 用 Web 浏览器安全连接一个购物站点(HTTPS)
- 加密的 Email
- 安排两台主机建立加密受保护的信道
为了建立一个加密的会话,就需要一个加密的手段来交换会话密钥(往往是对话双方共享的一个对称密钥)。
数字签名
数字签名(Digital Signature)是公钥密码学的核心应用之一,用于实现信息的身份认证、数据完整性和不可否认性
| 安全属性 | 含义 |
|---|---|
| 身份认证(Authentication) | 接收方能确认消息确实来自声称的发送方 |
| 数据完整性(Integrity) | 消息在传输中未被篡改 |
| 不可否认性(Non-repudiation) | 发送方事后不能否认自己签过该消息 |
数字签名 = 私钥签名 + 公钥验证,通常结合密码学哈希函数使用
- 签名:发送方计算消息 M 的哈希值 $h = H(M)$,再用私钥加密 h,得到签名 $S = D_{SK}(h)$;
- 发送:将 $(M, S)$ 发送给接收方;
- 验证:接收方用发送方公钥解密 $S$ 得 $h’$,同时计算 $H(M)$ 得 $h’’$,若 $h’ == h’’$ 则验证通过。
消息认证
消息认证是使消息接受者能验证收到的消息在传输过程中有没有被纂改、伪造和假冒,消息的完整性、有效性和真实性是否被破坏的过程。
基于 Hash 函数实现
![[images/Pasted image 20251204132423.png]]
![[images/Pasted image 20251204132432.png]]
数字信封技术
数字信封(Digital Envelope) 是一种结合对称加密与公钥加密优势的混合加密技术,用于高效、安全地传输机密数据。其核心思想是:用对称密钥加密数据,再用接收方的公钥加密该对称密钥——这个被加密的对称密钥就称为“数字信封”
结合两者优点:
- 用 AES 快速加密大文件
- 用 RSA 安全传输 AES 密钥
工作流程
生成会话密钥
- Alice 随机生成一个一次性对称密钥 $K_{session}$ (如 256 位 AES 密钥)
用对称密钥加密消息
- $C=AES_{K_{session}}(M)$
→ 得到密文 $C$
用公钥加密会话密钥(创建“信封”)
注意是对密钥加密
- $E=RSA_{pub_B}(K_{session})$
→ $E$ 就是数字信封
发送(密文 + 数字信封)
- Alice 发送给 Bob:$(C,E)$
解开数字信封并解密
- 用自己的私钥解密信封:
$K_{session}=RSA_{priv_B}(E)$ - 用恢复出的会话密钥解密消息:
$M=AES_{K_{session}}^{−1}(C)$
特点
| 特性 | 说明 |
|---|---|
| 高效性 | 大数据用 AES 加密(快),仅小密钥用 RSA(可接受) |
| 安全性 | 会话密钥一次一密,即使长期私钥泄露,单次会话仍安全(若配合前向安全协议) |
| 可扩展性 | 可同时发给多人:为每人用其公钥加密同一会话密钥 |
| 标准化 | 广泛用于 S/MIME、PGP、CMS(Cryptographic Message Syntax)等协议 |
证书
数字证书是一个由可信第三方签发的电子“身份证”,将公钥与身份信息(如域名、组织名)绑定在一起
标准格式:X.509
X.509
| 字段 | 说明 |
|---|---|
| 版本(Version) | v1, v2, v3(v3 支持扩展) |
| 序列号(Serial Number) | 证书唯一标识 |
| 签名算法 | CA 签名所用算法(如 SHA256-RSA) |
| 颁发者(Issuer) | 签发该证书的 CA 名称 |
| 有效期(Validity) | Not Before / Not After |
| 主体(Subject) | 证书持有者身份(如 CN=www.example.com) |
| 主体公钥(Subject Public Key) | 持有者的公钥 + 算法(如 RSA 2048) |
| 扩展(Extensions) | (v3 特有)如: • Key Usage(用途限制) • Extended Key Usage(如 serverAuth, codeSigning) • Subject Alternative Name (SAN)(支持多域名) |
| CA 签名 | 整个证书内容的数字签名(由 CA 私钥生成) |
公钥基础设施(PKI Public Key Infrastructure)
PKI 是一套策略、流程、硬件、软件和标准的集合,用于创建、管理、分发、使用、存储和撤销数字证书。
| 组件 | 作用 |
|---|---|
| 终端实体(End Entity) | 证书使用者(如 Web 服务器、用户、设备) |
| 证书颁发机构(CA, Certificate Authority) | 可信第三方,负责签发和吊销证书 |
| 注册机构(RA, Registration Authority) | 可选,负责验证申请者身份(可与 CA 合并) |
| 证书吊销列表(CRL, Certificate Revocation List) | CA 定期发布的已吊销证书列表 |
| 在线证书状态协议(OCSP, Online Certificate Status Protocol) | 实时查询证书是否有效(替代 CRL) |
| 证书存储库 | 存放证书和 CRL 的公共目录(如 LDAP、HTTP) |
证书链
大多数证书不是由根 CA 直接签发,而是通过中间 CA(Intermediate CA) 层级签发,形成一条信任链
- 安全隔离:根 CA 离线保存,永不联网,避免私钥泄露
- 灵活管理:不同业务用不同中间 CA(如 Web、邮件、代码签名)
- 吊销影响小:中间 CA 泄露只需吊销它,不影响根
[终端实体证书] www.example.com
↑ 由 Intermediate CA 1 签名
[中间 CA 证书] Example Corp Intermediate CA
↑ 由 Root CA 签名
[根 CA 证书] Example Corp Root CA(自签名)
验证过程
- 浏览器收到服务器证书(含公钥)
- 检查证书是否由受信任的根 CA签发
- 若直接由根签发 → 用内置根公钥验证
- 若由中间 CA 签发 → 需同时提供中间证书
- 浏览器逐级向上验证签名,直到找到本地信任库中的根证书
- 同时检查:
- 证书是否在有效期内
- 域名是否匹配(SAN 或 CN)
- 证书是否被吊销(通过 CRL 或 OCSP)
服务器配置 HTTPS 时,必须发送完整的证书链(终端 + 所有中间证书),否则客户端可能无法构建信任链
证书生命周期
- 申请:生成密钥对,提交 CSR(Certificate Signing Request)给 CA
- 验证:CA 验证申请者身份(域名控制、企业信息等)
- 签发:CA 用私钥签名,生成证书
- 部署:安装到服务器/设备
- 使用:用于 TLS、签名等
- 吊销(如私钥泄露):
- 通过 CRL 或 OCSP 发布吊销状态
- 过期:自动失效(通常 90 天 ~ 1 年,Let’s Encrypt 为 90 天)