分组算法计算流程
分组算法要对输入数据进行分组,然后按数据分组进行运算。一个典型的分组算法由三部分组成:数据分组、分组运算、链接模式。
数据分组:
数据分组在加密时会将明文数据分组为加密算法能够处理的固定大小的数据块。比如AES能够处理的数据块大小为128位,那么数据就要被分割成一个或多个128为的数据块。
如果不能整分,就要把最后一个分组补齐为128位。这些分组数据的运算结果,组合起来就是密文数据。
解密时进行相反的操作将补齐数据去掉,再把数据分组组合成完整的明文数据。
理解了数据分组再来看一下分组运算和链接模式。
分组运算,意思是将每一个明文数据分组经过加密函数转换为密文数据分组。而链接模式,指的是如何将上一个运算和下一个运算联系起来。
还有一点需要说明,第一个分组运算并没有上一个分组运算可供使用,这时候,我们就需要引入一个初始化的数据,来承担“上一个分组运算”向下链接的功能。这个初始化的数据,我们一般称为初始化向量。
那你有没有想过,我们为什么要把上一个分组运算和下一个分组运算联系起来呢?其实,我们在前面讨论过单向散列函数的链接模式,我们说它是为了确保雪崩效应能够延续。
在分组运算里,链接模式也承担类似的功能:
- 不同的明文数据,它的密文数据应该是完全不同的,即使明文数据里包含相同的数据分组;
- 相同的明文数据,每一次的加密运算,它的密文数据也应该是完全不同的。
什么影响算法的安全性
- 加密函数和解密函数
- 密钥
- 初始化向量
- 数据补齐方案
- 链接模式
初始化向量怎么选
- 选择安全强度足够的随机数作为初始化向量
- 使用序列数,下一次使用的初始化向量的数值,比上一次使用的加一或减一
一个密钥能使用多少次
前面,我们讨论了,在一个对称密钥的生命周期里,初始化向量不能重复。也就是说,对于一个算法来说,初始化向量的长度是固定的。长度固定,也就意味着初始化向量的个数是有限制的。
比如,一个 128 位的初始化向量,最多有 2^ 128 个不重复的数值。进一步的说,对于这个算法,一个密钥最多只能使用 2^ 128 次。的确看起来,2^128 是一个巨大的数字,一般的应用程序也没有什么机会使用这么多次加密运算。