3.4 加密与解密
知识点
1.为什么需要加密
问题:数据在网络中传输、在设备中存储,随时可能被窃听、截获、篡改。仅靠"不让别人接触"(物理隔离)无法应对互联网环境。
解决思路:把可读的信息变成不可读的乱码,即使被截获也看不懂——这就是加密。
加密要解决的四个安全问题(与必修2 呼应):
| 需求 | 加密如何满足 |
|---|---|
| 保密性 | 加密后即使被截获也看不懂 |
| 完整性 | 用哈希校验内容是否被改动 |
| 身份真实性 | 用数字签名/证书证明"是谁发的" |
| 不可否认性 | 数字签名后发送方无法抵赖 |
2.基本术语(必背)
| 术语 | 含义 |
|---|---|
| 明文(Plaintext) | 加密前的原始信息,人可直接读懂 |
| 密文(Ciphertext) | 加密后的信息,人无法直接读懂 |
| 加密(Encryption) | 明文 → 密文 的变换过程 |
| 解密(Decryption) | 密文 → 明文 的还原过程 |
| 密钥(Key) | 加解密时使用的关键参数,决定变换的具体方式 |
| 密码算法(Cipher) | 加解密所依据的规则/方法 |
最重要的一个观念(柯克霍夫原则):算法的安全性应当只依赖于密钥的保密,而不依赖于算法的保密。
通俗理解:锁的构造公开没问题,只要钥匙不丢就安全。所以"自己发明的保密算法"通常不如公开检验过的标准算法可靠。
密钥空间:密钥所有可能取值的个数。密钥越长,暴力破解需要的尝试次数越多(呈指数级增长)。
3.古典加密方法
(1)凯撒密码(移位密码)
原理:把每个字母在字母表中向后移动固定的位数(凯撒用的是 3 位)。
明文:A B C D E F …… X Y Z
密文:D E F G H I …… A B C (每个字母后移 3 位)
示例:HELLO → KHOOR
解密:向前移动同样的位数(KHOOR → HELLO)。
密钥:移动的位数(这里是 3)。密钥空间很小(只有 25 种可能),很容易被穷举破解。
Python 实现:
# 3-1 凯撒密码加密(只处理小写字母,密钥 k)
def caesar_encrypt(text, k):
result = ""
for ch in text:
if "a" <= ch <= "z":
# ord 取字符编码,chr 由编码还原字符
result += chr((ord(ch) - ord("a") + k) % 26 + ord("a"))
else:
result += ch # 非字母原样保留
return result
print(caesar_encrypt("hello", 3)) # khoor
关键技巧:(x + k) % 26 实现"绕回"——z 后面接 a,靠取余完成。
两个必备函数(考点):
| 函数 | 作用 | 示例 |
|---|---|---|
ord(ch) | 字符 → 编码值 | ord("A") → 65 |
chr(n) | 编码值 → 字符 | chr(65) → "A" |
记忆:ord 是 "order"(序号),chr 是 "character"(字符)。
(2)替换密码
原理:按一张替换表,把每个字符换成表中对应的另一个字符(不一定是移位)。
示例表:a→q, b→w, c→e, d→r, e→t …(键盘序列)
优点:比凯撒密码的密钥空间大得多;
缺点:仍保留了字母出现的频率特征,可用频率分析法破解(英文中 e 出现最多,密文中最高频的字母很可能就是 e)。
(3)古典密码的共同弱点
- 加密单位小(一个字母一个字母换),模式可被统计分析;
- 密钥空间有限,易被穷举;
- 不适合现代大数据量加密。
因此现代加密都以"比特块"为单位,并用复杂的数学运算。
4.现代加密:对称与非对称(本小节核心对比)
(1)对称加密(单钥加密)
原理:加密与解密使用同一把密钥。
明文 --[密钥K加密]--> 密文 --[密钥K解密]--> 明文
| 项目 | 内容 |
|---|---|
| 代表算法 | DES(数据加密标准,56 位密钥,已不安全)、3DES、AES(高级加密标准,128/192/256 位,现行主流) |
| 优点 | 算法简单、加解密速度快,适合大量数据加密 |
| 缺点 | 密钥分发困难——双方必须事先安全地共享同一把密钥;密钥数量随用户数平方增长(n 人互通用 n(n-1)/2 把钥匙);无法实现不可否认(双方都有同一把钥匙,谁都能伪造) |
| 典型应用 | 文件加密、磁盘加密、HTTPS 中加密实际传输的数据 |
密钥数量公式(易考):n 个人两两通信,需要 n(n-1)/2 把密钥。10 个人需要 45 把。
(2)非对称加密(公钥加密)
原理:一对密钥——公钥(Public Key) 与 私钥(Private Key),成对生成:
- 公钥公开,谁都可以拿;
- 私钥自己保管,绝不外传;
- 公钥加密的数据,只有对应私钥能解;私钥加密(签名)的数据,用公钥能验证。
| 项目 | 内容 |
|---|---|
| 代表算法 | RSA(最经典)、ECC(椭圆曲线) |
| 优点 | 解决了密钥分发问题(公钥可公开传递);可实现数字签名(不可否认) |
| 缺点 | 运算复杂、速度慢(比对称加密慢数百倍以上),不适合加密大数据 |
| 典型应用 | 密钥交换、数字签名、数字证书、小数据量加密 |
两种方向的用法(必须分清):
| 目的 | 用哪把钥匙加密 | 用哪把钥匙解密 |
|---|---|---|
| 让别人安全发消息给我 | 对方用我的公钥加密 | 我用自己的私钥解密 |
| 证明消息是我发的(签名) | 我用自己的私钥加密(签名) | 任何人用我的公钥验证 |
记忆口诀:"公钥加密、私钥解密;私钥签名、公钥验证"。
(3)对称与非对称对比表
| 对比项 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 把(共用) | 1 对(公钥 + 私钥) |
| 加解密速度 | 快 | 慢 |
| 密钥分发 | 困难(要先安全传钥匙) | 容易(公钥可公开) |
| 能否签名 | 不能 | 能 |
| 适用数据量 | 大量数据 | 少量数据(密钥、摘要) |
| 代表算法 | DES、AES | RSA、ECC |
实际系统的做法(混合加密,重要):用非对称加密安全地传一把"会话密钥",再用这把对称密钥加密真正的大量数据——兼得"安全"与"快"。这正是 HTTPS 的做法。
5.哈希(散列)函数
定义:把任意长度的数据映射为固定长度的摘要(如 MD5 得到 128 位/16 字节,SHA-1 得到 160 位)。
三个特性:
- 单向不可逆——由摘要无法还原原文(所以叫"单向加密",严格说不是加密);
- 雪崩效应——原文改动一个字符,摘要面目全非;
- 抗碰撞——很难找到两段不同数据产生相同摘要(MD5/SHA-1 已被证明可构造碰撞,现推荐 SHA-256)。
典型用途:
| 用途 | 说明 |
|---|---|
| 完整性校验 | 下载文件后比对摘要,判断是否被篡改 |
| 口令存储 | 数据库只存口令的哈希值,不存明文;登录时比对哈希 |
| 数字签名 | 先对内容求摘要,再对摘要签名(因为摘要短,签名快) |
为什么口令要加"盐"(salt):直接哈希的简单口令容易被"彩虹表"反查,加一段随机串再哈希可大幅提高破解成本。
考点提醒:MD5 常用 32 位十六进制字符串表示(128 位 = 16 字节 = 32 个十六进制位)。
6.数字签名与数字证书
(1)数字签名
作用:证明消息确实由某人发出且内容未被篡改,并实现不可否认。
过程(五步):
① 发送方对原文计算摘要(哈希)
② 发送方用自己的【私钥】加密该摘要 → 得到"签名"
③ 签名随原文一起发送
④ 接收方用发送方的【公钥】解密签名,得到摘要1
⑤ 接收方自己计算原文的摘要2,比较摘要1 与 摘要2
相同 → 未被篡改且确实是对方发的;不同 → 内容被改或签名伪造
要点:签名用的是私钥,验证用的是公钥;签名的是摘要,不是原文(效率考虑)。
(2)数字证书
要解决的问题:公钥怎么证明"真的是他的"?攻击者可以伪造一对密钥并冒充"某银行"发布公钥。
数字证书:由权威的第三方机构 CA(Certificate Authority,认证中心) 签发的电子凭证,把"公钥 + 持有者身份信息"绑定在一起,并用 CA 的私钥签名。
验证链:浏览器内置了受信任的根证书,用它验证网站的证书签名 → 确认公钥可信 → 再建立加密连接。
生活类比:数字证书 ≈ 身份证 + 派出所的公章;CA ≈ 派出所。
7.HTTPS 的工作过程(综合应用,常考流程题)
① 客户端向服务器发起 HTTPS 请求
② 服务器返回【数字证书】(内含公钥,由 CA 签名)
③ 客户端验证证书(用内置根证书验证签名、检查域名与有效期)
④ 客户端生成一个随机的【会话密钥】,用服务器的【公钥】加密后发给服务器
⑤ 服务器用自己的【私钥】解密,双方得到同一个会话密钥
⑥ 之后所有数据都用这把【对称会话密钥】加密传输
为什么这样设计:非对称加密解决"密钥怎么安全地给",对称加密解决"数据怎么快速地加密"——混合加密的经典范例。
浏览器地址栏的"小锁" 就表示:证书验证通过 + 连接已加密。
8.异或加密(简单而重要的思想)
异或运算(XOR,符号 ^)的性质:
| 性质 | 说明 |
|---|---|
| 相同为 0,不同为 1 | 0^0=0、1^1=0、1^0=1、0^1=1 |
| 自反性 | a ^ b ^ b = a —— 用同一个密钥异或两次就还原 |
因此异或可以同时用于加密和解密:
# 3-2 异或加密(对字符编码逐位异或)
def xor_cipher(text, key):
result = ""
for ch in text:
result += chr(ord(ch) ^ key) # 加密
return result
c = xor_cipher("hello", 7)
print(c) # 一串乱码字符
print(xor_cipher(c, 7)) # hello ← 再异或一次就还原
要点:同一个函数既是加密也是解密;密钥就是那个整数。
缺点:如果密钥是单字节,很容易被频率分析破解,实际使用需用足够长且随机的密钥流(如一次性密码本)。
9.综合对比:加密、哈希、编码(极易混)
| 项目 | 目的 | 能否还原 | 有无密钥 | 例子 |
|---|---|---|---|---|
| 加密 | 保密(不让别人看懂) | 能(有密钥即可解密) | 有 | AES、RSA、凯撒密码 |
| 哈希 | 校验完整性/存口令 | 不能(单向) | 一般无 | MD5、SHA-256 |
| 编码 | 格式转换(便于传输/存储) | 能(按规则直接还原) | 无 | ASCII、UTF-8、Base64、URL 编码 |
关键结论:Base64 不是加密! 它只是"把二进制转成可打印字符"的编码,任何人都能解开。"编码不等于加密"是高频判断题。
10.易错点清单
| 序号 | 错误认识 | 正确理解 |
|---|---|---|
| 1 | "加密算法要保密才安全" | 算法可公开,密钥必须保密 |
| 2 | "公钥和私钥都能随便公开" | 只有公钥可公开,私钥绝不可外传 |
| 3 | "用公钥签名" | 签名用私钥,验证用公钥 |
| 4 | "非对称加密比对称加密快" | 恰恰相反,非对称慢得多 |
| 5 | "哈希就是加密,可以解密" | 哈希单向不可逆,不能"解密" |
| 6 | "MD5 是加密算法" | 是哈希(摘要)算法,不可逆 |
| 7 | "Base64 是加密" | 是编码,无密钥,可逆 |
| 8 | "凯撒密码很安全" | 密钥空间仅 25 种,可穷举 |
| 9 | "口令直接存明文最方便" | 必须存哈希值(最好加盐) |
| 10 | "HTTPS 全程用非对称加密" | 只有协商密钥用非对称,数据用对称 |
| 11 | 忘记 % 26 导致越界 | 移位必须取余,才能绕回 |
| 12 | ord 与 chr 用反 | ord 字→码,chr 码→字 |
11.速查表
| 序号 | 考点 | 结论 |
|---|---|---|
| 1 | 六个基本术语 | 明文、密文、加密、解密、密钥、密码算法 |
| 2 | 安全性的关键 | 密钥保密,算法可公开 |
| 3 | 凯撒密码位移 | 3 位 |
| 4 | 凯撒密码的弱点 | 密钥空间小,可穷举 |
| 5 | 替换密码的弱点 | 可用频率分析破解 |
| 6 | ord("A") | 65 |
| 7 | chr(65) | "A" |
| 8 | 移位绕回的做法 | (x + k) % 26 |
| 9 | 对称加密代表 | DES、AES |
| 10 | 对称加密优点 | 速度快,适合大数据 |
| 11 | 对称加密缺点 | 密钥分发难、不能签名 |
| 12 | 非对称加密代表 | RSA |
| 13 | 非对称加密优点 | 解决密钥分发、可签名 |
| 14 | 非对称加密缺点 | 速度慢 |
| 15 | 公钥用途 | 加密(别人发给我)、验证签名 |
| 16 | 私钥用途 | 解密(我收信)、签名(我发信) |
| 17 | 口诀 | 公钥加密私钥解密,私钥签名公钥验证 |
| 18 | n 人两两通信需要的对称密钥数 | n(n-1)/2 |
| 19 | MD5 摘要长度 | 128 位 = 16 字节 = 32 位十六进制 |
| 20 | 哈希三特性 | 单向、雪崩效应、抗碰撞 |
| 21 | 哈希的用途 | 完整性校验、口令存储、数字签名 |
| 22 | 数字签名签的是什么 | 原文的摘要 |
| 23 | 数字证书由谁签发 | CA(认证中心) |
| 24 | 证书绑定了什么 | 公钥 + 身份信息 |
| 25 | HTTPS 实际数据用什么加密 | 对称加密(会话密钥) |
| 26 | 异或的性质 | a ^ b ^ b = a(自反) |
| 27 | 混合加密的目的 | 非对称传密钥 + 对称传数据 |
| 28 | Base64 | 是编码,不是加密 |
12.课堂提示(讲课参考)
- 先玩"凯撒密码"再讲原理:让学生用后移 3 位互相传小纸条,5 分钟就理解"明文—密文—密钥"。
ord与chr现场演示:ord("a")得 97、chr(98)得 b,学生就能自己写移位公式。- 对称加密的密钥个数用"握手"活动体会:10 个同学两两通信要 45 把钥匙,全班 50 人就 1225 把——非对称加密的必要性一下就出来了。
- 哈希用"剁馅"比喻:肉能剁成馅,馅不能还原成肉;馅的味道能验证是不是同一块肉——单向 + 校验两个特性一次讲完。
- HTTPS 用"寄保险箱"的故事串一遍:网站先把"开着锁的保险箱(公钥)"寄给你,你把"会话密钥"锁进去寄回,之后双方用小钥匙快速通信。
- 务必强调"Base64 不是加密",这是判断题和选择题的固定陷阱。