编码与加密 · 网络安全入门
Base64 算加密吗?到底什么才能让消息保密?
课程目录为什么需要它
很多真实的泄露,都是因为有人以为「看起来乱码」就等于被保护了。编码、加密、哈希在屏幕上看着差不多,作用却完全不同。把它们搞混,是代码评审里最常见的安全错误之一。
直觉理解
- 编码是换一套字母表,让数据能安全地传输,就像把消息写成摩斯电码。谁都能还原,因为根本没有密钥。
- 加密是一把锁。只有拿着密钥的人,才能把乱码变回原文。
- 哈希是指纹(第 3 课):原文根本拿不回来。
这一课要用到两个工具:
ord("a")给出字符对应的数字(97),chr(97)再把数字变回"a"。^是异或 XOR:它会翻转二进制位。用同一个密钥异或两次,就会得到原来的值,所以真实的加密算法里也会用到它。
定义
编码与加密
Encoding transforms data into another format using a public scheme and needs no key to reverse. Encryption transforms data so that it can only be reversed with a secret key.编码用公开的规则把数据换成另一种格式,还原不需要密钥。加密把数据变换成只有用秘密密钥才能还原的形式。
密钥 Key
The secret value that controls an encryption: the same algorithm with a different key gives a different result.控制加密过程的秘密值:同一个算法,换一个密钥,结果就完全不同。
示例
Base64 什么都没藏住
动手试试Base64 把字节变成字母和数字,方便放进邮件和网址里。解码不需要任何秘密。
import base64
secret = "pin=4821"
encoded = base64.b64encode(secret.encode()).decode()
print(encoded)
print(base64.b64decode(encoded).decode())逐步执行
- L3
.encode()把文字变成字节,Base64 处理的是字节。 - L4看着像乱码,其实只是换了一套字母表。
cGluPTQ4MjE= - L5谁都能解开,整个过程没有密钥。
pin=4821
凯撒密码有密钥
动手试试每个字母沿字母表往后移 key 位。用同样的数往回移,就能解开。
def caesar(text, key):
out = ""
for ch in text:
if "a" <= ch <= "z":
out += chr((ord(ch) - ord("a") + key) % 26 + ord("a"))
else:
out += ch
return out
locked = caesar("attack at dawn", 3)
print(locked)
print(caesar(locked, -3))逐步执行
- L4只移动小写字母,空格保持不变。
- L5字母 → 0 到 25 的数,加上密钥,
% 26让 z 之后绕回 a,再变回字母。 - L10用密钥 3 把消息锁上。
- L11a→d,t→w……
dwwdfn dw gdzq - L12用同一个密钥反向移动,就解开了。
attack at dawn
常见错误
把 Base64 当成保护
用 Base64「藏起来」的 API 密钥和密码,谁看到都能读出来。要保密的东西,要么加密,要么干脆不存。
自己发明加密算法
凯撒密码和简单 XOR 很适合学习,但实际使用中一破就开:凯撒密码一共才 26 个密钥。真实系统用的是经过检验的算法,比如通过库调用 AES,网络传输用 TLS。
小测验
1. 这段代码会输出什么?
def caesar(text, key):
out = ""
for ch in text:
out += chr((ord(ch) - ord("a") + key) % 26 + ord("a"))
return out
print(caesar("xyz", 2))查看答案
答案:A
x→z,y→a(绕回开头),z→b。绕回靠的就是 % 26。
2. 下面哪个不需要密钥,谁都能还原成原文?
查看答案
答案:A
Base64 是编码:规则公开,可以还原。AES 需要密钥,哈希则根本无法还原。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出异或两次
准确写出这段程序的输出。
- 改需求大写字母也要移
这个凯撒密码只会移动小写字母。修改它,让大写字母也一起移动,并且保持大写:
caesar("Hello, World", 3)应该返回"Khoor, Zruog"。 - 从零写破解凯撒密码
凯撒密码一共只有 26 个密钥,攻击者可以全部试一遍。写一个函数
crack(locked, word):从 0 到 25 试每一个密钥,返回加密时用的那个密钥。已知原文里一定出现单词word。caesar函数已经写好了。用密钥k解密,就是caesar(locked, -k)。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Encoding | 编码 | Changing data into another format with a public, reversible scheme such as Base64. |
| Encryption | 加密 | Scrambling data so only someone with the key can read it. |
| Key | 密钥 | The secret value that controls encryption and decryption. |
| XOR | 异或 XOR | A bit operation; XOR with the same key twice returns the original value. |