Rijndael的加密解密要经过多次的数据变换操作,每一次变换操作都会产生一个中间结果,我们称这个中间结果为状态。算法的所有操作都以状态为对象进行,每个状态可由字节的矩阵列表示,这种矩阵立列包含4行,矩阵列的列数目可以由Nb表示。密钥列表用Nk表示。他等于密钥的长度除以32.
从某种意义上来讲,这些数据也可以看作是4字节的一维向量,每个向量由相应的矩阵的一个列组成。Nb于Nk的可取值为4、6、8,下面的矩阵的形式由列出Nb不同取值情况下的数组结构:
以下为Nk不同取值情况下数组的矩阵形式:
算法中的加密解密是迭代进行的,它的重复次数成为轮数,用Nr来表示。Nr由Nb和Nk共同决定。
(1)字节置换
字节置换是一种非线性的置换,字节置换对分组矩阵的每个字节执行一次非线性字节替换操作。假设a(x)为状态数组中的一个字节,采用多项式表示,讲GF中的元素用多项式的形式表示,且系数是GF2中的元素。值得一提的是,字节替换作为Rijndael算法的唯一一个非线性运算,是整个算法中的最关键部分,也是最复杂的部分。
(2)行位移
行位移将状态数组的每一行进行循环左移操作,位移量随着不同的行而有所不同。其中,第0行的位移为0,第一行循环左移c1字节,第二行循环左移c2字节。位移操作是算法中的一个基本的操作,无论是在加密过程中的初始轮还是在加密过程中的中间轮,位移的操作一直存在。
(3)列混合
在列混合变换中,将一个列视为上的多项式,再与一个固定的模式进行乘法,上面的公式运算可以展开为有限的加法与乘法运算,从而在很大程度上简化了运算的复杂度。列混合并没有贯穿夹击算法的整个流程,在最后一轮的运算并没有包含列混合的操作。
(4)添加密钥
在添加密钥变换中,每一轮的密钥被加载状态数组上,有限域上的假发相当于亦或操作。其中轮密钥由密钥调度模块产生,它由Nb个列组成。这Nb个列被加到状态数组中的每一列上。
(5)轮密钥表
在AES算法中,一共要产生Nb(nr+1)个字的密钥。轮密钥是由初始密钥产生的,它分为两个步骤进行:密钥扩展与轮密钥的选择,且遵循一定的原则。