用verilog实现AES密码算法1---一些理论准备

用verilog实现AES密码算法1—一些理论准备

这两周做了一个课程设计,是AES密码算法的加解密,用verilog实现的,因为从原理到设计花了一些时间,笔记本上记录了一堆厚厚的分析资料,俗话说好记性不如烂笔头,我觉得有必要记录这些工作。

AES算法总体介绍

AES算法的分组长度和**长度均能被独立指定为128位、192位或256位,**长度不同,则加密轮数不同。本次实验以**长度128位,加密10轮为例,算法中16字节的明文、密文和轮**都以一个4x4的矩阵表示。下图为AES算法加解密的流程图:
用verilog实现AES密码算法1---一些理论准备
AES加密过程涉及到4种操作:分别是字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮**加(AddRoundKey)。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的**分别由初始**扩展得到。下面是AES一轮加密的过程。
用verilog实现AES密码算法1---一些理论准备

字节代换

字节代换的主要功能是通过S盒完成一个字节到另外一个字节的映射,也可以简化为一个简单的查表操作。S盒用于加密查表,逆S盒用于解密查表。它们都是由1616字节组成的矩阵,即矩阵共有256元素,每元素的内容是一个1个字节(8bit)的值,且每个元素各不相同。状态矩阵中的元素按照下面的方式映射为一个新的字节;把该字节的高4位作为行值,低四位作为列值,取出S盒或者逆S盒中对应行列的元素作为输出。AES定义了一个S盒和一个逆S盒,下图AES算法的S盒和逆S盒表格。
用verilog实现AES密码算法1---一些理论准备

行移位

行移位的功能是实现一个4x4矩阵内部字节之间的置换。它分为正向行移位和行移位逆变换。
正向行移位(左移)
这是一个简单的左循环移位操作。128bit时,状态矩阵的第0行左移0字节,第一行左移1字节,第2行左移2字节…正向行移位的原理图如下:
用verilog实现AES密码算法1---一些理论准备
行移位逆变换(右移)
这是一个简单的右循环移位操作。当**长度为128bit时,状态矩阵的第0行右移0字节,第一行右移1字节,第2行右移2字节
用verilog实现AES密码算法1---一些理论准备

列混淆

列混淆变换是通过矩阵相乘来实现的,分为正向列混淆和列混淆逆变换,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵。正向列混淆的原理图如下:
用verilog实现AES密码算法1---一些理论准备
根据矩阵的乘法可知,在列混淆的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法都是定义在GF(28)上的,需要注意如下几点:
(1) 将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011;
(2) 此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(相当于是异或运算)。
下面是列混淆逆运算的矩阵乘法定义:
用verilog实现AES密码算法1---一些理论准备

**扩展

AES首先将初始**输入到一个4*4矩阵中,如图3所示,这个44矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为ω[0]、ω[1]、ω[2]、ω[3].它们构成了一个以字为单位的数组ω。
用verilog实现AES密码算法1---一些理论准备
接着,对ω数组扩充40个新列,构成总共44列的扩展**数组,新列以如下的递归方式产生:
(1) 若i不是4的倍数,那么第i列由 用verilog实现AES密码算法1---一些理论准备确定;
(2) 若i是4的倍数,那么第i列由用verilog实现AES密码算法1---一些理论准备 确定。
其中g是一个复杂的函数,其组成如下图4所示
用verilog实现AES密码算法1---一些理论准备用verilog实现AES密码算法1---一些理论准备
由图4看出,g函数由字循环、字节代换和轮常量异或三部分组成,这三部分的作用分别如下:
(1) 字循环:将1个字中的4个字节循环左移1个字节;
(2) 字节代换:对字循环的结果使用S盒(参照图1)进行字节代换;
(3) 轮常量异或:对前两步的结果同轮常量Rcon[j](其值见表5)进行异或,其中j代表轮数。
轮常量Rcon[j]是一个字,其值见表。

j 1 2 3 4 5 6 7 8 9 10
Rcon[j] 01000000 02000000 04000000 08000000 10000000 20000000 40000000 80000000 1B000000 36000000

轮**加

轮**加是将128位轮**Ki同状态中的数据进行逐位的异或操作,轮**由**扩展所得。

总结一下

今天总结了AES的结构和各模块的划分,下面几章就要分模块写出verilog的代码。

第一次使用CSDN的这个markdown做笔记还有一些不熟悉的地方,排版这些以后写多了慢慢再改的好看一些。
keep calm and carry on.

Bruce李
西安电子科技大学
2017年6月6日