← 返回 计算机网络原理

计算机网络原理

第八章 第1节

第八章 网络安全:

1. 什么是网络安全?

网络安全不是单纯“加密”。它至少包括四个目标:

1. 机密性

2. 认证

3. 报文完整性

4. 可用性 / 访问控制

1.1 机密性 confidentiality

意思是:只有发送方和指定接收方能看懂报文内容。

比如 Alice 给 Bob 发消息,中间 Trudy 截获了报文,但是看不懂。

明文:我能直接看懂的内容

密文:别人看到了也看不懂的内容

1.2 认证 authentication

意思是:Bob 要确认:和我通信的人真的是 Alice。

不是别人说一句:I am Alice,Bob 就相信。

因为 Trudy 也可以说:I am Alice

所以认证的核心是:如何证明“你就是你”?

1.3 报文完整性 message integrity

意思是:报文在传输过程中没有被改过。

比如 Alice 发的是:转账 10 元Trudy 不能把它改成:

转账 10000 元

完整性关心的不是“别人能不能看到”,而是:别人有没有偷偷改?

1.4 可用性 availability

意思是:服务应该能正常使用。

比如网站服务器不能被大量请求打垮,正常用户应该还能访问。

这对应里的:拒绝服务攻击 DoS

不是偷数据,而是让服务不能正常工作。

2. Alice、Bob、Trudy 模型

这章一直用三个角色:

Alice:发送方

Bob:接收方

Trudy:攻击者 / 入侵者

Alice 和 Bob 想安全通信,Trudy 在中间可能做坏事。

Trudy 可能做的事:

1. 窃听:偷看报文

2. 插入:插入假的报文

3. 伪装:假装成 Alice 或 Bob

4. 劫持:中途接管连接

5. 拒绝服务:让服务无法正常使用

这部分要理解成一个模型,不是具体某一个攻击工具。考试一般会考这些安全目标和威胁类型。

3. 加密基本术语

基本结构是:

明文 m

↓ 加密算法 + 加密密钥 K_A

密文 K_A(m)

↓ 解密算法 + 解密密钥 K_B

明文 m

公式写成:

m = K_B(K_A(m))

意思是:

Alice 用加密密钥把明文变成密文,Bob 用解密密钥把密文还原成明文。

3.1 明文和密文

plaintext:明文,看得懂的原始内容

ciphertext:密文,加密后的内容

比如:

明文:bob, i love you. alice

密文:nkn, s gktc wky. mgbc

这里密文不一定有意义,它只是经过加密算法变换后的结果。

4. 如何破解一个加密方案?

有几类攻击方式,从弱到强。

第八章 第1节 配图 1

4.1 唯密文攻击 ciphertext-only attack

Trudy 只有密文。

Trudy 看不到明文

只能分析密文规律

可能方法:

暴力破解:尝试所有可能密钥

统计分析:分析字母出现频率

比如英文里 e、t、a 出现频率高,如果密文中某个字母出现特别多,可能对应 e。

4.2 已知明文攻击 known-plaintext attack

Trudy 手上有一些:明文 + 对应密文

比如知道:

明文:hello

密文:xxxxx

它就可以推测加密规律。比唯密文攻击更强。

4.3 选择明文攻击 chosen-plaintext attack

Trudy 可以主动选择一些明文,让系统加密,然后拿到对应密文。

比如它故意输入:

aaaaa

bbbbb

abcde

看输出密文有什么规律。

这是更强的攻击模型。

5. 对称密钥加密

对称密钥加密的核心是:加密和解密使用同一个秘密密钥 K_S

也就是:

Alice 用 K_S 加密

Bob 用 K_S 解密

公式:

密文 = K_S(m)

明文 = K_S^{-1}(密文)

5.1 对称加密最大的问题

问题不是加密本身,而是:

Alice 和 Bob 一开始怎么安全地拥有同一把密钥?

如果网络本身不安全,那么直接把密钥发过去,Trudy 也能截获。

所以对称加密的问题是:密钥分发困难

6. 简单对称加密:替换密码

第八章 第1节 配图 2

替换密码就是:一个字母替换成另一个字母(比如说凯撒加密)

比如:

a → m

b → n

c → b

那么:bob

就可能变成:nkn

这种方法的密钥就是:26 个字母到 26 个字母的映射关系

6.1 单表替换的问题

它太容易被统计分析破解。

比如英文里:

e 出现最多

the 很常见

ing 很常见

所以只要密文足够长,Trudy 可以根据频率猜出来。

7. 更复杂的替换密码

为了增强安全性,可以使用多个替换表:

M1, M2, M3, ..., Mn

并且循环使用。

比如 n = 4:

第 1 个字符用 M1

第 2 个字符用 M2

第 3 个字符用 M3

第 4 个字符用 M4

第 5 个字符再用 M1

...

这样同一个字母在不同位置可能加密成不同字符。

比单表替换强,但现代安全要求下仍然不够。

8. DES 和 AES

8.1 DES

第八章 第1节 配图 3

DES 全称:Data Encryption Standard

特点:

1. 对称密钥加密

2. 56-bit 密钥

3. 64-bit 明文分组

4. 16 轮类似函数运算

DES 的流程可以简单理解成:

64-bit 输入

→ 初始置换

→ 分成左右两半

→ 16 轮变换

→ 最终置换

→ 64-bit 输出

8.2 DES 的问题

DES 的密钥只有 56 bit。

现在看太短了,容易被暴力破解。

所以后来有:3DES

AES

8.3 AES

AES 全称:Advanced Encryption Standard

它是 DES 的替代品。

特点:

1. 对称密钥加密

2. 分组长度 128 bit

3. 密钥长度可以是 128 / 192 / 256 bit

4. 现代常用

DES:老,56-bit 密钥,不够安全

AES:新,128/192/256-bit 密钥,更安全

9. 密码块链 CBC

第八章 第1节 配图 4

前面分组加密有一个问题:如果两个明文块一样,加密后密文块也一样

比如:

m(1) = "HTTP/1.1"

m(17) = "HTTP/1.1"

如果都直接用同一个块密码加密,就可能得到相同密文。

这会泄露规律。

9.1 CBC 的基本思想

CBC:Cipher Block Chaining。

核心是:每一轮加密前,把当前明文块和上一轮密文块结合起来

大致形式:

c(i) = E_K( m(i) XOR c(i-1) )

这样即使:

m(1) = m(17)

由于前一个密文块不同,最后得到的密文也可能不同。

每一块加密都带上前一块的影响。 这样相同明文块不会简单对应相同密文块。

10. 公钥密码

对称加密的问题是:双方要先共享同一个秘密密钥

公钥密码解决这个问题。

公钥密码有两把钥匙:

公钥:公开,所有人都可以知道

私钥:秘密,只有本人知道

比如 Bob 有:

Bob 的公钥 K_B^+

Bob 的私钥 K_B^-

10.1 公钥加密怎么用?

Alice 想给 Bob 发秘密消息。

过程:

1. Alice 获取 Bob 的公钥 K_B^+

2. Alice 用 Bob 的公钥加密消息

3. Bob 收到密文

4. Bob 用自己的私钥 K_B^- 解密

公式:m = K_B^-(K_B^+(m))

核心:

第八章 第1节 配图 5

公钥可以给全世界,别人只能用它加密给 Bob; 只有 Bob 的私钥能解开。

11. RSA 公钥密码

RSA 是典型公钥算法。

它要满足两个要求:

1. K_B^-(K_B^+(m)) = m

2. 已知公钥 K_B^+,很难推出私钥 K_B^-

RSA 的安全性来自一个事实:

大整数分解很难

也就是:n = p q

如果 p、q 很大,别人只知道 n,很难把 n 分解回 p 和 q。

12. RSA 前置知识:模运算

模运算就是取余数。

x mod n = x 除以 n 的余数

例子:

14 mod 10 = 4

196 mod 10 = 6

重要性质:

[(a mod n) + (b mod n)] mod n = (a+b) mod n

[(a mod n) - (b mod n)] mod n = (a-b) mod n

[(a mod n) × (b mod n)] mod n = (a×b) mod n

所以:(a mod n)^d mod n = a^d mod n

RSA 能把大指数计算拆开算

13. RSA 生成公钥和私钥

步骤如下。

1. 选择两个很大的质数 p, q

2. 计算 n = p q

3. 计算 z = (p-1)(q-1)

4. 选择 e,使 e 和 z 互素

5. 选择 d,使 ed mod z = 1

6. 公钥是 (n, e)

7. 私钥是 (n, d)

注意:

公钥:(n, e)

私钥:(n, d)

n 是两边都知道的。

14. RSA 加密和解密

设明文数字是 m,要求:

m < n

加密:c = m^e mod n

解密:m = c^d mod n

也就是:

m = (m^e mod n)^d mod n

数论保证它能还原。

15. RSA 例子

p = 5

q = 7

n = 35

z = (5-1)(7-1) = 24

e = 5

d = 29

因为:

e d mod z = 5 × 29 mod 24 = 145 mod 24 = 1

所以符合要求。

15.1 加密

明文:

m = 12

加密:

c = m^e mod n

c = 12^5 mod 35

计算:

12^2 = 144,144 mod 35 = 4

12^4 mod 35 = 4^2 = 16

12^5 mod 35 = 16 × 12 = 192

192 mod 35 = 17

所以:

c = 17

15.2 解密

解密:

m = c^d mod n

m = 17^29 mod 35

结果会还原为:

m = 12

所以:12 → 加密成 17 → 解密回 12

16. 为什么 RSA 可以用于数字签名?

K_B^-(K_B^+(m)) = m

K_B^+(K_B^-(m)) = m

也就是说:

先公钥后私钥可以

先私钥后公钥也可以

这就为数字签名做准备。

加密时:别人用 Bob 的公钥加密,只有 Bob 能用私钥解密

签名时:Bob 用自己的私钥处理,别人用 Bob 的公钥验证

注意这里逻辑不一样。

公钥加密:为了保密

私钥签名:为了证明身份

17. 为什么 RSA 安全?

如果攻击者知道 Bob 的公钥:(n, e)

要破解就要找:d

而求 d 通常需要知道:

z = (p-1)(q-1)

要知道 z,就需要知道 p 和 q。

但是攻击者只知道:n = p q

如果 n 很大,分解 n 非常困难。

所以 RSA 的安全性来自:大整数分解困难

18. RSA 实践:会话密钥

RSA 很强,但是有一个问题:RSA 指数运算很慢

DES/AES 这种对称加密至少比 RSA 快很多

所以实际系统不会用 RSA 加密大量数据。

实际做法是:

1. 用 RSA 安全交换一个对称密钥 K_S

2. 后面真正传大量数据时,用 K_S 进行 AES 等对称加密

这个 K_S 叫:会话密钥 session key

18.1 为什么这样设计?

因为:

RSA:安全交换密钥,但慢

AES:加密大量数据很快,但需要双方先有同一个密钥

所以两者结合:

RSA 解决密钥分发问题

AES 负责高效加密数据

公钥密码负责“安全递钥匙”,对称加密负责“真正锁门”。

19. 认证 authentication

现在进入下一个主题:认证。

认证目标:Bob 需要 Alice 证明她真的是 Alice

19.1 Protocol ap1.0:直接说身份

协议:Alice → Bob: I am Alice

这个显然不安全。

因为 Trudy 也可以发:

I am Alice

所以:只声明身份 ≠ 证明身份

19.2 Protocol ap2.0:加上 IP 地址

改进方案:Alice → Bob: I am Alice + Alice 的 IP 地址

这仍然不够安全。

因为攻击者可能伪造源地址,或者重放之前截获的报文。

所以问题是:IP 地址不是强身份凭证

后面认证会继续引入:

nonce 随机数

共享密钥

公钥签名

来防止伪装和重放。

对称加密像同一把钥匙开同一把锁;

公钥加密像每个人都有一个公开上锁孔和一个私人开锁钥匙;

RSA 负责安全交换钥匙,AES 负责真正快速加密数据;具体算法了解即可

认证要证明身份,不能只是嘴上说“我是 Alice”