AES
明文和密钥的结构
高级加密标准(AES,Advanced Encryption Standard),分组加密算法的一种。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。
AES的处理单位是字节,一个块128个bit,也就是16个字节,可以写成4*4的矩阵,按顺序如下排列:
128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个32位比特字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加。后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示:
加密流程
每一轮共分为四个步骤:
- 字节代换
- 行位移
- 列混合
- 轮密钥加
在第一轮的开头先要进行一次密钥加,在最后一轮是不进行列混合
字节代换
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。
行移位
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:
列混合
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵。矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法,如1+1=0,-1+0=1。
AES中式将输入的矩阵左乘一个固定的矩阵,其规则和矩阵相乘的规则相同,但运算是在域下进行的,注意是先相乘模除后再异或,切不可先异或后再模除
密钥加
将轮密钥和状态矩阵逐比特异或即可