AES的标准规范的加密流程中每组密钥和明文长度都为16字节,加密轮数为10轮。
AES的明文和密钥是按照字节的先后顺序从上到下、从左到右进行排列的。而加密出的密文读取顺序也是按照这个顺序读取的,相当于将数组还原成字符串的模样了,然后再解密的时候又是按照4x4数组处理的。

主要为以下四个处理过程:
- 密钥加法层 (也叫轮密钥加,英文Add Round Key)
- 字节代换层 (SubByte)
- 行位移层 (Shift Rows)
- 列混淆层(Mix Column)

左图为AES加密的流程图,
可以看到在进入第一轮加密之前会做一个密钥加法层,之后除了最后一轮加密,其他都是常规的四个加密操作(最后一轮只是少了一次列混淆层的操作 ):字节代换层→行位移层→列混淆层→密钥加法层。
还有一点需要注意的是密钥在每轮都会进行变换
密钥加法层:
在密钥加法层中有两个输入的参数,分别是明文和子密钥k[0],而且这两个输入都是128位的。k[0]实际上就等同于密钥k,只需要将两个输入的数据进行按字节异或操作就会得到运算的结果。

具体实现代码为:
字节代换层:
这层的主要功能就是让输入的数据通过S_box表完成从一个字节到另一个字节的映射;S盒是16×16个字节组成的矩阵,行列的索引值分别从0开始,到十六进制的F结束,每个字节的范围为(00-FF)。

读取S_box数据的方法就是要将输入数据的每个字节的高四位作为第一个下标,低四位作为第二个下标。

实现代码:
行位移
行移位是一个4x4的矩阵内部字节之间的置换,用于提供算法的扩散性。
正向行移位用于加密,其原理图如下。其中:第一行保持不变,第二行循环左移8比特,第三行循环左移16比特,第四行循环左移24比特。

对应代码:
列混淆层
在加密的正向列混淆中,我们要将输入的4·4矩阵左乘一个给定的4·4矩阵。

这里也就是用固定的做矩阵乘以右边待混淆的矩阵数据,需要注意的是这里涉及到一个数学问题
密钥扩展:

子密钥的生成是以列为单位进行的,一列是32Bit,四列组成子密钥共128Bit。生成子密钥的数量比AES算法的轮数多一个,因为第一个密钥加法层进行密钥漂白时也需要子密钥。密钥漂白是指在AES的输入盒输出中都使用的子密钥的XOR加法。子密钥在图中都存储在W[0]、W[1]、...、W[43]的扩展密钥数组之中。k1-k16表示原始密钥对应的字节,而图中子密钥k0与原始子密钥相同。在生成的扩展密钥中W的下标如果是4的倍数时(从零开始)需要对异或的参数进行G函数处理。扩展密钥生成有关公式如下:

函数G()首先将4个输入字节进行翻转,并执行一个按字节的S盒代换,最后用第一个字节与轮系数Rcon进行异或运算。轮系数是一个有10个元素的一维数组,一个元素1个字节。G()函数存在的目的有两个,一是增加密钥编排中的非线性;二是消除AES中的对称性。这两种属性都是抵抗某些分组密码攻击必要的。

生成密钥代码:
AES解密流程:

解密阶段与加密阶段相似,但有几处参数或顺序不同:
- 逆字节代换层 S-Box 变为 逆S-Box:

- 逆向行位移层 左移变为右移动:

- 逆列混淆层 左乘矩阵变为下面这样
