问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于FPGA的AES256加密算法实现

创作时间:
作者:
@小白创作中心

基于FPGA的AES256加密算法实现

引用
CSDN
1.
https://blog.csdn.net/m0_37857391/article/details/145306006

AES256是一种广泛使用的对称加密算法,其加密和解密过程都使用相同的密钥。本文将详细介绍AES256算法的原理及其在FPGA上的实现方法,包括算法流程、FPGA架构设计以及仿真测试结果。

1.AES256算法介绍

AES256算法为最常见的对称加密算法,对称加密算法也就是加密和解密用相同的密钥,具体的加解密流程如下图。

其中,明文P是指没有经过加密的数据,数据长度128bit;密钥K是用来加密明文或解密密文的密码,在对称加密算法中,加密与解密的密钥是相同的,长度为256bit;密文C为经加密函数处理后的数据,数据长度128bit;AES256加解密函数为明文与密文之间换算的算法。

2.AES256算法流程

AES256算法并不是一次性将明文转变为密文的算法,而是经过许多轮的计算得到的,共需要14轮计算,除去初始轮和最终轮其余普通轮计算加密过程均要涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

由于AES256算法加密解密均需要进行14轮的计算,因此在开始执行算法前需要将初始密钥K进行密钥扩展生成14轮计算所需的子密钥。

2.1密钥扩展

子密钥的生成是以列为单位进行的,一列是32Bit,四列组成子密钥共128Bit。生成子密钥的数量比AES算法的轮数多一个,因此AES256算法共计14轮,子密钥为W[0,3]、W[4,7]…W[52,55]、W[56,59]。

2.2字节替代

字节替代的主要功能就是让输入的数据通过S盒表完成从一个字节到另一个字节的映射。加密时字节替换用S盒,逆S盒与S盒对应,用于解密时对数据处理,解密时的程序处理称作逆字节代换。

S盒表:

逆S盒表:

2.3行位移

行位移操作是用来将输入数据作为一个4x4的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。它只在4x4矩阵的行间进行操作,每行4字节的数据。在加密时,保持矩阵的第一行不变,第二行向左移动8Bit(一个字节)、第三行向左移动2个字节、第四行向左移动3个字节。而在解密时恰恰相反,依然保持第一行不变,将第二行向右移动一个字节、第三行右移2个字节、第四行右移3个字节。在加密时行位移处理与解密时的处理相反,将解密时的处理称作逆行位移。

2.4列混合

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,加密过程列混合如下图的公式所示:

解密过程为逆向列混合运算,逆向列混合变换可由下图的矩阵乘法定义:

2.5轮密钥加

轮密钥加是将128位子密钥W同状态矩阵中的数据进行逐位异或操作。

2.6加密流程

具体加密流程如下图所示,在执行加密之前先由扩展密钥模块将256bit的初始密钥生成计算所需的子密钥,即W[0,3]、W[4,7]…W[52,55]、W[56,59],然后依据下图流程进行计算,最终完成加密计算。

2.7解密流程

解密流程其实质为加密过程的逆运算,如下图所示。

3.AES256算法实现

3.1AES256算法FPGA实现架构

采用FPGA实现AES256加解密算法,其内部结构框图如下图所示,AES算法核内部主要由三部分构成:密钥扩展模块、数据加密模块、数据解密模块。

AES256算法顶层接口如下,包括模式选择、密钥注入、明密文输入、密明文输出、忙信号。算法采用纯verilog实现,没有调用任何ip核,可移植到任意fpga平台,不受芯片厂商限制。


module aes_core_top
(
  input mclk,         // Master clock
  input arst_n,       // active low asynchronous reset
// inputs
    input mode_select,                //mode   1:encrypt   0:decrypt
    input [0:255] cipherkey,
    input cipherkey_dv,
    input [0:127] plaintext,             
    input plaintext_dv,              
    
// outputs
    output [0:127] ciphertext,       
    output ciphertext_dv,
    output busy_enc,
    output busy_exp
);
  

AES算法核顶层模块内例化了三个模块,密钥扩展模块、数据加密模块、数据解密模块


/
encryptor encryptor
(
  .mclk           (mclk					)	,
  .arst_n			(arst_n				)	,
  .plaintext		(plaintext			)	,
  .roundkey       (roundkey			)	,
  .start_enc   	(start_enc			)	,
  .ciphertext		(ciphertext_e		)	,
  .ciphertext_dv	(ciphertext_dv_e	)	,
  .round_count		(round_count_e		)	,
  .busy_enc			(busy_enc_e			)	
);
decryptor decryptor
(
  .mclk           (mclk					)	,
  .arst_n			(arst_n				)	,
  .plaintext		(plaintext			)	,
  .roundkey       (roundkey			)	,
  .start_enc   	(start_enc			)	,
  .ciphertext		(ciphertext_d	   )	,
  .ciphertext_dv	(ciphertext_dv_d	)	,
  .round_count		(round_count_d		)	,
  .busy_enc			(busy_enc_d			)	
);
key_repository key_repository
(
  .mclk           (mclk					)	,
  .arst_n			(arst_n				)	,
  .mode_select    (mode_select      )  ,
  .cipherkey      (cipherkey			)	,
  .start_exp   	(start_exp			)	,
  .round_count		(round_count		)	,
  .roundkey       (roundkey			)	,
  .busy_exp			(busy_exp			)	
);
  

3.2密钥扩展模块

AES算法中密钥扩展模块的功能是将256bit主密钥变换生成每轮加密运算所需要的子密钥,在此部分模块设计中,内部设置rk0~rk14共15个128bit的寄存器用于存储15个子密钥,该模块在生成子密钥的过程中会将算法忙信号拉高,等待子密钥生成完成后,忙信号置0。模块仿真结果如下。

3.3数据加密模块

AES算法中数据加密模块内部是按照标准AES256加密算法流程进行计算,共计进行14轮计算涉及4种操作计算,分别是轮密钥加、字节替代、行移位和列混合,每一种操作计算都讲结果缓存在对应的寄存器里,roundstate_curr寄存器缓存轮密钥加结果;subbytes寄存器缓存字节替换后的结果;shiftrows寄存器缓存行位移后的结果;mixcolumns寄存器缓存列混合后的结果。在此部分模块设计中,当检测到数据加密使能信号start_enc置’1’时,明文与子密钥就会按照算法流程进行一轮一轮的计算,直至ciphertext_dv信号输出脉冲,此时密文输出即为加密后的数据。该模块在数据加密的过程中会将忙信号拉高,等待数据加密完成后,忙信号置0,模块仿真结果如下。

3.4数据解密模块

数据解密模块内部是数据加密模块的逆运算,涉及4种操作计算,分别是轮密钥加、逆字节替代、逆行移位和逆列混合,在此部分模块设计同数据加密模块一样,当检测到数据解密使能信号start_enc置’1’时,密文与子密钥就会按照算法流程进行一轮一轮的计算,直至ciphertext_dv信号输出脉冲,此时密文输出即为解密后的数据。该模块在数据解密的过程中会将忙信号拉高,等待数据解密完成后,忙信号置0,模块仿真结果如下。

4算法核仿真结果

采用标准向量进行仿真测试,计算一个分组需要16个时钟周期,算法核整体仿真结果如下:

加密过程:

key = “603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4”

明文为"6bc1bee22e409f96e93d7e117393172a"

加密结果,密文为"f3eed1bdb5d2a03c064b5a7e3db181f8"

解密过程:

key = “603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4”

密文为"f3eed1bdb5d2a03c064b5a7e3db181f8"

解密结果,明文为"6bc1bee22e409f96e93d7e117393172a"

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号