0%

对称加解密

  1. 常用算法

对称加解密常用的算法有DES,3DES,AES, SM4。

DES算法现在已经破解,明文64bit,密文64bit,秘钥64bit(实际56bit,每隔7bit有一个
错误检查bit)。

3DES是DES计算三次(加密,解密,加密), 有三个64bit秘钥。

AES(提交时的算法名字叫Rijndael, 比利时人设计), 分支固定长度是128bit,秘钥长度可以
是128,192或者256bit。

SM4是中国自己的一种分组密码标准。分组长度和秘钥都是128bit。

这里有一个密码算法的分类: 分组密码和流密码。一般,上面提到的密码都采用分组密码。
流密码的意思是,对一串数据流进行加密,加密过程存在中间状态。

  1. 分组密码的模式

使用分组密码加密的时候,要把数据切成一块一块的分组(block)。根据分组之间的不同关系,
我们有不同的分组密码工作模式。模式有:ECB,CBC, CFB,OFB, CTR, XTS等。

ECB(Electronic CodeBook), block之间完全没有关系的分组加密。不推荐使用。

CBC(Cipher Block Chaining), 加密的逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            +---------+      +---------+      +---------+
|明文分组1| |明文分组2| |明文分组3|
+---------+ +---------+ +---------+
v v v
+---+ +---+ +---+
+----->|XOR| +--->|XOR| +---->|XOR|
| +---+ | +---+ | +---+
| v | v | v
| +----+ | +----+ | +----+
| |加密| | |加密| | |加密|
| +----+ | +----+ | +----+
| v | v | v
+--+ | +---------+ | +---------+ | +---------+
|IV|---+ |密文分组1|---+ |密文分组2|---+ |密文分组3|
+--+ +---------+ +---------+ +---------+

注意,IV(初始化向量)是一个分组长度的一个随机数。
CBC解密的逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            +---------+      +---------+      +---------+
|明文分组1| |明文分组2| |明文分组3|
+---------+ +---------+ +---------+
^ ^ ^
+---+ +---+ +---+
+----->|XOR| +--->|XOR| +---->|XOR|
| +---+ | +---+ | +---+
| ^ | ^ | ^
| +----+ | +----+ | +----+
| |解密| | |解密| | |解密|
| +----+ | +----+ | +----+
| ^ | ^ | ^
+--+ | +---------+ | +---------+ | +---------+
|IV|---+ |密文分组1|---+ |密文分组2|---+ |密文分组3|
+--+ +---------+ +---------+ +---------+

可以看到CBC加密只能一个block一个block的顺序进行。解密时,如果一个密文分组出了问题
会影响到当前和下一个明文分组。翻转密文分组中的一个bit,会使得下一个明文分组中的
对应bit翻转,会使得当前明文分组中的若干个bit变化,接收方无法识别这种攻击,需要
引入消息认证码解决。

CFB(Cipher FeedBack), 密文反馈模式。OFB(Output-Feedback), 输出反馈模式。
CTR(Counter模式)。这几种模式的模型差不多,区别在于秘钥流生成的方式不一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     +--------+   	         +--------+                     +--------+
|明文分组| |明文分组| |明文分组|
+--------+ +--------+ +--------+
| | +--------+ |
v v | | v
+----+ +---+ +----+ +---+ | +---+ | +----+ +---+
+->|加密|---->|XOR| +->|加密|--+--->|XOR| +->|CTR|-+->|加密|-->|XOR|
| +----+ +---+ | +----+ | +---+ +---+ +----+ +---+
| | | | | |
| v | | v v
| +--------+ | | +--------+ +--------+
+-----------|密文分组| +----------+ |密文分组| |密文分组|
+--------+ +--------+ +--------+

CFB OFB CTR

这几种模式的明文和密文之间都只差一个异或操作,唯一不同的是异或操作的另一个操作数。
CFB用的是上次生成的密文加密得到;OFB用IV反复加密得到;CTR用一个计数器反复加密得到。
可以看到CFB的每次操作必须要依赖上一次的加密结果,OFB可以提前准备每次要用的异或值,
CTR甚至可以直接得到某个分组需要用的异或值,前后依赖程度逐个变小。

XTS模式主要用于磁盘加解密,可以做到block之间独立的加解密。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        +------------+            +----+
|128bit tweak| |明文|
+------------+ +----+
| v
| +---+
| +---+XOR|
| | +---+
v | v
+----+ +----+ +--+ | +----+ +----+
|key2|---->|加密|---->|GF|----+ |加密|<-----|key1|
+----+ +----+ +--+ | +----+ +----+
| v
| +---+
+-->|XOR|
+---+
v
+----+
|密文|
+----+

Note: 消息认证码中的GCM模式依赖上述的CTR模式;基于CBC的消息认证码是CCM;使用hash
来生成消息认证码(带秘钥的hash)叫HMAC。