1. AES明文即密钥长度

        明文:明文分组长度为128位,即16字节。

        密钥:密钥长度可以是16字节,24字节,32字节(128位,192位,256位)。根据密钥的长度,算法被分为AES-128、AES-192、AES-256。

2. AES加解密过程

        加密和解密算法的输入是一个128位分组,这个分组被描述为4×4字节的方阵。同样,密钥也被描述为方阵。密钥被扩展为一个密钥字序列,每个字都为4字节,128位密钥最终拓展为44个字的序列。       

        注意:矩阵中的字节按列排序。加密算法的128位明文分组输入的前4字节被按序放在in矩阵的第一列,接着的4字节放在in矩阵的第二列,以此类推。类似的,扩展密钥的前4字节放在w矩阵的第一列。

        密码由N轮组成,N取决于密钥长度。密钥扩展函数产生N+1轮密钥。

        前N-1轮由4个不同的变换组成:①字节替代②行移位③列混淆④轮密钥加。

        第N轮只包含3个变换:缺少了列混淆。

        在第一轮的前面有一个起始的单变换(轮密钥加),可将其视为第0轮。

        与大多数分组密码一样,解密算法按逆序方式利用了扩展密钥。然而,AES解密算法与加密算法并不相同,这是由AES的特定结构决定的。

3. S-Box的构造

3.1 S盒的构造

        1)按字节的升序逐行初始化S盒。第一行是{00},{01},{02},...,{0F};第二行{10},{11},{12},...,{1F};以此类推。y行x列的字节值是{yx}。

        2)将S盒中的每个字节映射为他在有限域GF(2^8)中的逆;{00}映射为其自身{00}。

        3)将S盒中每个字节的8个构成位记为({b_7,b_6,b_5,b_4,b_3,b_2,b_1,b_0})。对S盒的每个字节的每个位做如下变换:

{b}'=b_i\oplus b_{(i+4)mod\;8}\oplus b_{(i+5)mod\;8}\oplus b_{(i+6)mod\;8}\oplus b_{(i+7)mod\;8}\oplus c_i

  式中,c_i是指值为{63}的字节c的第i位,即(c_7,c_6,c_5,c_4,c_3,c_2,c_1,c_0)=(01100011)。符号  “ ' ”表示变量的值要被等式右边的值更新。AES标准用矩阵形式描述了这个变换:

\begin{bmatrix} b_7'\\b_6' \\b_5' \\b_4' \\b_3' \\b_2' \\b_1' \\b_0' \end{bmatrix}=\begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0\\ 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0\\ 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0\\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1\\ 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1\\ 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1\\ 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1\\ 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} b_7\\ b_6\\ b_5\\ b_4\\ b_3\\ b_2\\ b_1\\ b_0 \end{bmatrix}+\begin{bmatrix} 0\\ 1\\ 1\\ 0\\ 0\\ 0\\ 1\\ 1 \end{bmatrix}

3.2 逆S盒的构造

1)按字节的升序逐行初始化S盒。第一行是{00},{01},{02},...,{0F};第二行{10},{11},{12},...,{1F};以此类推。y行x列的字节值是{yx}。

2)逆变换

{b}'=b_{(i+2)mod\;8}\oplus b_{(i+5)mod\;8}\oplus b_{(i+7)mod\;8}\oplus d_i

        式种,字节d={05}或00000101。可以按如下方式描述这个变换:

\begin{bmatrix} b_7'\\b_6' \\b_5' \\b_4' \\b_3' \\b_2' \\b_1' \\b_0' \end{bmatrix}=\begin{bmatrix} 0 & 1 & 0 & 1 & 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1 & 0 & 0 & 1 \\ 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 0 & 0 & 1 & 0 & 0 \end{bmatrix}\begin{bmatrix} b_7\\ b_6\\ b_5\\ b_4\\ b_3\\ b_2\\ b_1\\ b_0 \end{bmatrix}+\begin{bmatrix} 0\\ 0\\ 0\\ 0\\ 0\\ 1\\ 0\\ 1 \end{bmatrix}

3)求逆变换后的值在有限域GF(2^8)的乘法逆元。

        基本原理:S盒的输出值不能是输入的线性数学函数。非线性度的产生是因为使用了乘法逆元。此外,在式(6.1)中选择的常量使得在S盒中没有不动点[S-box(a) = a],也没有反不动点[S-box(a) = \bar{a}],其中\bar{a}表示a的逐位取反。

4. 行移位变换

4.1正向行移位

        状态的第一行保持不变,状态的第二行循环左移1字节,状态的第三行循环左移2字节,状态的第四行循环左移3字节

4.2 逆向行移位

        状态的第一行保持不变,状态的第二行循环右移1字节,状态的第三行循环右移2字节,状态的第四行循环右移3字节。

        基本原理:行移位将某字节从一列移到另一列,它的线性距离是4字节的倍数,这个变换确保一列中的4字节被拓展到4个不同的列。

5. 列混淆变换

5.1 正向列混淆

        正向列混淆变换对每列独立的进行运算。每列中的每个字节都被映射为一个新值,该值由列中的4字节通过函数变换得到。这个变换可由下面基于状态的矩阵乘法表示:

\begin{bmatrix} 02 & 03 & 01 & 01\\ 01 & 02 & 03 & 01\\ 01 & 01 & 02 & 03\\ 03 & 01 & 01 & 02 \end{bmatrix} \begin{bmatrix} s_{0,0} & s_{0,1} & s_{0,2} & s_{0,3}\\ s_{1,0} & s_{1,1} & s_{1,2} & s_{1,3}\\ s_{2,0} & s_{2,1} & s_{2,2} & s_{2,3}\\ s_{3,0} & s_{3,1} & s_{3,2} & s_{3,3} \end{bmatrix} =\begin{bmatrix} s_{0,0}' & s_{0,1}' & s_{0,2}' & s_{0,3}'\\ s_{1,0}' & s_{1,1}' & s_{1,2}' & s_{1,3}'\\ s_{2,0}' & s_{2,1}' & s_{2,2}' & s_{2,3}'\\ s_{3,0}' & s_{3,1}' & s_{3,2}' & s_{3,3}' \end{bmatrix}

5.2 逆向列混淆

        逆向时称的乘的矩阵为:

\begin{bmatrix} 0E & 0B & 0D & 09\\ 09 & 0E & 0B & 0D\\ 0D & 09 & 0E & 0B\\ 0B & 0D & 09 & 0E \end{bmatrix}

        基本原理:正向列混淆使用的乘法矩阵的系数基于码字间有最大距离的线性编码,这使得每列的所有字节具有良好的混淆性。此外,列混淆变换的系数{01},{02},{03}是基于算法实现角度考虑的。这些系数的乘法涉及至多一次移位和一次XOR。逆向列混淆变换中的系数更加难以实现。

6. 轮密钥加

        轮密钥加就是将状态矩阵与轮密钥矩阵对应字节进行XOR。

        基本原理:尽管轮密钥加斌换非常简单,但能对状态中的每一位产生影响。密钥扩展的复杂性和AES的其他阶段运算的复杂性,确保了该算法的安全性。

7. 密钥扩展

        输入密钥直接被复制到扩展密钥数组的前4个字。在扩展密钥数组中,每个新增的字w_i依赖于w_{i-1}w_{i-4}。分为两种情况,当 i 不是4的倍数时,使用了异或运算,当 i 是4的倍数时,采用了更复杂的函数计算。下图说明了如何计算扩展密钥,其中 g表示这个复杂的函数。

 

        Rcon[j]是轮常量,其中j=i/4。这个轮常量是一个字,这个字左右边的3个字节为0。因此,字与Rcon异或,结果只与该字最左边的那个字节异或。每轮的轮常量均不同,其定义为Rcon[j]=(RC[j],0,0,0),其中,RC[1]=1RC[j]=2RC[j-1](乘法是定义在域GF(2^8)上的)。RC[j]的值按十六进制表示为:

j12345678910
RC[j]01020408102040801B36

        

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐