人人都能学编程
English 开始学习
专项 · 网络安全第 2 课 / 共 9 课免费阅读

编码与加密 · 网络安全入门

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())
逐步执行
  1. L3.encode() 把文字变成字节,Base64 处理的是字节。
  2. L4看着像乱码,其实只是换了一套字母表。cGluPTQ4MjE=
  3. 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))
逐步执行
  1. L4只移动小写字母,空格保持不变。
  2. L5字母 → 0 到 25 的数,加上密钥,% 26 让 z 之后绕回 a,再变回字母。
  3. L10用密钥 3 把消息锁上。
  4. L11a→d,t→w……dwwdfn dw gdzq
  5. 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))
  1. A
    zab
  2. B
    z{|
  3. C
    abc
查看答案

答案:A

x→z,y→a(绕回开头),z→b。绕回靠的就是 % 26。

2. 下面哪个不需要密钥,谁都能还原成原文?

  1. ABase64 编码后的文字
  2. B用 AES 加密后的文字
  3. CSHA-256 哈希值
查看答案

答案:A

Base64 是编码:规则公开,可以还原。AES 需要密钥,哈希则根本无法还原。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出异或两次

    准确写出这段程序的输出。

  2. 改需求大写字母也要移

    这个凯撒密码只会移动小写字母。修改它,让大写字母也一起移动,并且保持大写:

    caesar("Hello, World", 3) 应该返回 "Khoor, Zruog"。

  3. 从零写破解凯撒密码

    凯撒密码一共只有 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异或 XORA bit operation; XOR with the same key twice returns the original value.