团队介绍
大家好,我们的团队名称是293小分队,报名编号为CICC1363。这次分享我们会简要介绍AES加解密算法的逻辑实现,以及如何将AES算法做成硬件协处理器集成在蜂鸟E203 SoC上。
AES算法介绍
AES算法属于对称密码算法中的分组密码,其明文/密文分组长度为128bit,并支持128bit、192bit、256bit等三种密钥长度。密钥长度为192bit和256bit的AES算法处理方式与密钥长度为128bit的处理方式类似,但是密钥长度每增加64bit,算法的循环轮数就要增加2轮。
AES密码算法的内部结构由多个层构成,每一层都是对整个处理块16字节进行操作,并且循环多轮进行处理。在加密运算中,每一轮运算包含四种不同类型的层:密钥加法层、字节代换层、行移位层和列混淆层;而在解密运算中,同样包含四种不同类型的层:密钥加法层、逆字节代换层、逆行移位层和逆列混淆层。AES密码算法总共进行多少次轮变换,取决于AES密码算法的密钥长度:密钥长度为128位的情况下,对应的轮变换迭代次数为10轮;密钥长度为192位的情况下,对应的轮变换迭代次数为12轮;密钥长度为256位的情况下,对应的轮变换迭代次数为14轮。而AES密码算法的输入数据分组长度固定为128位。AES算法的加密和解密流程如下图所示:
AES算法逻辑实现
整个AES使用verilog实现,主要难点在于字节代换模块(S盒)和(逆)列混淆模块的逻辑实现。
字节代换模块是整个AES算法中唯一的非线性模块,通常有两种实现方式:查找表法和复合域降阶法。查找表法的实现较为简单,由于S盒的实质是一一映射,在verilog中直接使用case语句即可;而复合域降阶法需要根据字节代换的数学公式进行推导,选择合适的基,通过伽罗瓦域的运算将GF(2^8)降阶到GF(2^4)。两种实现方法各有优劣,查找表法速度快但是资源开销大,复合域降阶法速度慢但是资源开销小。
(逆)列混淆模块的实质是做矩阵乘法,但是如果直接使用verilog实现矩阵乘法会导致面积开销大,建议方法是先对矩阵乘法进行共享项合并,从而显著渐少面积开销,同时加密中使用的列混淆运算和解密中使用的列混淆运算可以再进行共享项合并,从而实现加解密复用的效果。
AES加解密算法协处理器实现
AES加解密算法实现之后,可以方便的通过协处理器接口集成到蜂鸟E203 SoC中,如下图所示:
这里的NICE协处理器接口其实和demo中实现的矩阵累加协处理器接口有异曲同工之处:由协处理器接口的状态机对扩展指令进行译码,再根据译码后的结构确定是要从内存中取数据并配置状态、从内存中读取密文/明文和密钥或者向内存写入加解密的结果。之后再编写相应的C语言程序即可实现