- 常用算法
对称加解密常用的算法有DES,3DES,AES, SM4。
DES算法现在已经破解,明文64bit,密文64bit,秘钥64bit(实际56bit,每隔7bit有一个
错误检查bit)。
3DES是DES计算三次(加密,解密,加密), 有三个64bit秘钥。
AES(提交时的算法名字叫Rijndael, 比利时人设计), 分支固定长度是128bit,秘钥长度可以
是128,192或者256bit。
SM4是中国自己的一种分组密码标准。分组长度和秘钥都是128bit。
这里有一个密码算法的分类: 分组密码和流密码。一般,上面提到的密码都采用分组密码。
流密码的意思是,对一串数据流进行加密,加密过程存在中间状态。
- 分组密码的模式
使用分组密码加密的时候,要把数据切成一块一块的分组(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。