第六章 高级加密标准
美国国家技术研究所NIST在2001年发布了高级加密标准AES,一个对称分组密码算法,取代DES称为广泛使用的标准。
与公钥密码RSA相比,AES以及大多数的对称密码的结构都很复杂。
AES中所有的运算是在8位的字节上进行的。
一个域是一个结合,在集合内进行加减乘除运算的结果,也不会离开该域。例如\(Z_p=\{0,1,2,3,\dots,p-1\}\),其中\(p\)是一个素数,然后该域上的操作是取模。
1. AES的结构
明文分组长度为128位即16字节(对明文进行分组,每个组的昌都市128位)。密钥长度可以使16字节,24字节或是32位字节,对应的128位,192位,256位。根据密钥的长度。算法被称为AES-128等。
加密解密算法的明文输入是一个128位的分组。然后被分成一个\(4 \times 4\)的字节方针。
加密解密算法的密钥输入后也被组织成一个字节方阵,然后被扩展为:密钥字阵列。128位的密钥最终扩展为44个32位的序列:也就是说,128位的输入密钥,先按照\(4 \times 4\)字节的形式组织,然后扩展成44个4字节的序列\(w_i\)(数组),然后每4个序列组成一个\(4 \times 4\)的方阵(按列摆放),一共有11个方阵。128位密钥总共能够进行10轮(11次),192位对应12轮,256对应14轮。
每一轮都有:
- 字节代替
. 行位移
. 列混淆
. 轮密钥加
组成。
其中第0轮只是一次轮密钥加。因此严格意义上,128位的还是10次。
1.1 字节替换
字节替换是一个简单的查表操作。为的是:防止已有的各种密码分析的攻击。
AES定义了一个S盒,是一个\(16 \times 16\)字节组成的矩阵,也就是一个表。包含了8位所有能表示的256个数的一个置换,其中要置换字节的高4位作为行值,低4位作为列值。
另外还有一个逆S盒,是解密时候用的。
S盒的构造:
- 首先按照\((x,y)\)初始化盒中\(16 \times 16\)表格中的每一个。例如,第9行,2列的值就是\(92\)
- 然后对\(16\times 16\)表格中的每一个值用它的逆替换。(这个后面再看,有点小看不懂)
- 没看懂
S盒被设计成:能够防止已有的各种密码分析攻击。寻求输入和除数为之间相关性设计的很低,而且输出值不是输入值的线性数学函数时。
1.2 行位移变换
这个比较简单:第\(n\)行左移\(n\)个字节。(\(n\)从0开始)
行变换确保了某列中的四个字节被扩展到了4个不同的列:扩散
1.3 列混淆变换
列混淆变换的真相列混淆变换对每列独立的进行操作。
每列中的每个字节被映射为一个新值。辞职有改了中的每4个字节通过某个函数变换得来。其操作就是左乘一个\(4 \times 4\)的矩阵。
列混淆的矩阵中的值是基于码字间有最大距离的线性编码,使得每列的所有字节都有良好的混淆性。
列混淆和行变换使得在经过几轮变换后,所有的输出位于所有的输入位相关。
1.4 轮密钥加
是将前3个步骤的输出结果(其中第0轮,也就是第一次,直接使用第一组\(w_0\ ~\ w_3\)进行)与对应轮的密钥进行异或操作。
轮密钥加的变换操作影响了输入的每一位。密钥扩展的复杂性和AES其他阶段运算的复杂性,确保了该算法的安全性。
1.5 总结
AES不是一个Feistel结构,Feistel结构:数据分组中的一半使用密钥处理,然后用它来修改数据分组中的另一半,然后交换这两部分。
AES则是在每一轮都使用代替和混淆将这个数据分组作为一个单一的矩阵处理
2 AES密钥扩展算法
AES的密钥扩展算法输入值是16个字节(128位),输出是44个4字节的一维线性数组。(书上使用一个字表示4字节)
- 输入密钥被复制到扩展密钥数组的前4个字(原封不动的复制到了扩展密钥的前128位),这样就有了\(w[0] \dots w[3]\).
- 当\(w[i]\)的\(i\)是\(4\)的倍数时候,采用跟复杂算法计算一个tmp,也就是在第5的\(w\)的时候第一次计算tmp。其计算规则是:
- \(w[i-4]\)四个字节,都左移一个字节。
- 使用S盒替换其中的每个字节
- 与一个轮常量进行异或操作
- 然后每个\(w[i]\)是\(w[i-4]\)与tmp的异或结果。(tmp可以理解为,每4个\(w\)才会变一次的一个值)
轮常量是4个字节,右边3个字节都是0,左边一个字节每一轮都不同。虽然有固定的算法,但是每轮的轮常量最左一个字节是固定的。可以查表得到。
轮密钥的设计在于防止已有的密码分析攻击。轮常量则是为了防止不同的轮常量产生方式上的对称性或是相似性。
原文地址:https://www.cnblogs.com/perfy576/p/8996083.html