基于FPGA的AES加密解密vivado仿真,verilog开发,包含testbench

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 基于FPGA的AES加密解密vivado仿真,verilog开发,包含testbench

1.算法描述

     AES, 高级加密标准, 是采用区块加密的一种标准, 又称Rijndael加密法. 严格上来讲, AES和Rijndael又不是完全一样, AES的区块长度固定为128比特, 秘钥长度可以是128, 192或者256. Rijndael加密法可以支持更大范围的区块和密钥长度, Rijndael使用的密钥和区块长度均可以是128,192或256比特. AES是对称加密最流行的算法之一.

   AES算法在对明文加密的时候,并不是把整个明文一股脑的加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。这些明文块经过AES加密器复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密的结果。

   但这里涉及到一个问题,假如一段明文长度是196bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding) 。

   需要注意的是,如果在AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。

    殊的加法和乘法。AES 所用的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES 基于有限域GF(2^8)。 
   GF(2^8)由一组从 0x00 到 0xff 的256个值组成,加上加法和乘法,因此是(2^8)。GF代表伽罗瓦域,以发明这一理论的数学家的名字命名。GF(2^8) 的一个特性是一个加法或乘法的操作的结果必须是在{0x00 ... 0xff}这组数中。虽然域论是相当深奥的,但GF(2^8)加法的最终结果却很简单。GF(2^8) 加法就是异或(XOR)操作。 
    然而,GF(2^8)的乘法有点繁难。AES的加密和解密例程需要知道怎样只用七个常量 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e 来相乘。所以我不全面介绍GF(2^8)的乘法,而只是针对这七种特殊情况进行说明。 

在GF(2^8)中用0x01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样—任何值乘0x01等于其自身。

   现在让我们看看用0x02做乘法。和加法的情况相同,理论是深奥的,但最终结果十分简单。只要被乘的值小于0x80,这时乘法的结果就是该值左移1比特位。如果被乘的值大于或等于0x80,这时乘法的结果就是左移1比特位再用值0x1b异或。它防止了“域溢出”并保持乘法的乘积在范围以内。 
   一旦你在GF(2^8)中用0x02建立了加法和乘法,你就可以用任何常量去定义乘法。用0x03做乘法时,你可以将 0x03 分解为2的幂之和。为了用 0x03 乘以任意字节b, 因为 0x03 = 0x02 + 0x01,因此: 

b 0x03 = b (0x02 + 0x01) = (b 0x02) + (b 0x01)

   这是可以行得通的,因为你知道如何用 0x02 和 0x01 相乘和相加,同理,用0x0d去乘以任意字节b可以这样做:

b 0x0d = b (0x08 + 0x04 + 0x01)

= (b 0x08) + (b 0x04) + (b * 0x01)

= (b 0x02 0x02 0x02) + (b 0x02 0x02) + (b 0x01)

在加解密算法中,AES MixColumns 例程的其它乘法遵循大体相同的模式,如下所示:

b 0x09 = b (0x08 + 0x01)

= (b 0x02 0x02 0x02) + (b 0x01)b * 0x0b

= b * (0x08 + 0x02 + 0x01)

= (b 0x02 0x02 0x02) + (b 0x02) + (b 0x01)b 0x0e

= b * (0x08 +0x04 + 0x02)

= (b 0x02 0x02 0x02) + (b 0x02 0x02) + (b 0x02)

总之,在GF(2^8)中,加法是异或操作。其乘法将分解成加法和用0x02做的乘法,而用0x02做的乘法是一个有条件的左移1比特位。AES规范中包括大量有关GF(2^8)操作的附加信息。

     密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

AES支持三种长度的密钥: 128位,192位,256位

    平时大家所说的AES128,AES192,AES256,实际上就是指AES算法对不同长度密钥的使用。三种密钥的区别:

     从安全性来看,AES256安全性最高。从性能看,AES128性能最高。本质原因是它们的加密处理轮数不同。

    AES原理:AES是对数据按128位,也就是16个字节进行分组进行加密的,每次对一组数据加密需要运行多轮,而输入密钥的长度可以为128、192和256位,也就是16个字节、24个字节和32个字节,如果用户输入的密钥长度不是这几种长度,也会补成这几种长度。

  无论输入密钥是多少字节,加密还是以16字节的数据一组来进行的,密钥长度的不同仅仅影响加密运行的轮数。

     AES算法是一个对称分组密码算法。数据分组长度必须是 128 bits,使用的密钥长度为 128,192 或 256 bits。对于三种不同密钥长度的 AES 算法,分别称为“AES-128”、“AES-192”、“AES-256”。AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混(MixColumns)和轮密钥加(AddRoundKey)。

​ 从AES的加密和解密的流程图中可知:解密算法的每一步分别对应加密算法的逆操作。加解密所有操作的顺序正好是相反的,正是这样才保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到,算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。

2.仿真效果预览
vivado2019.2仿真结果如下:

80ca6054af685a1593da72fe8c9e6c6a_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
7aa543ed3f86e9b66c1431c4b52a9de1_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

3.verilog核心程序

reg    [127:0]    text_in_r;
reg    [127:0]    text_out;
reg    [7:0]    sa00, sa01, sa02, sa03;
reg    [7:0]    sa10, sa11, sa12, sa13;
reg    [7:0]    sa20, sa21, sa22, sa23;
reg    [7:0]    sa30, sa31, sa32, sa33;
wire    [7:0]    sa00_next, sa01_next, sa02_next, sa03_next;
wire    [7:0]    sa10_next, sa11_next, sa12_next, sa13_next;
wire    [7:0]    sa20_next, sa21_next, sa22_next, sa23_next;
wire    [7:0]    sa30_next, sa31_next, sa32_next, sa33_next;
wire    [7:0]    sa00_sub, sa01_sub, sa02_sub, sa03_sub;
wire    [7:0]    sa10_sub, sa11_sub, sa12_sub, sa13_sub;
wire    [7:0]    sa20_sub, sa21_sub, sa22_sub, sa23_sub;
wire    [7:0]    sa30_sub, sa31_sub, sa32_sub, sa33_sub;
wire    [7:0]    sa00_sr, sa01_sr, sa02_sr, sa03_sr;
wire    [7:0]    sa10_sr, sa11_sr, sa12_sr, sa13_sr;
wire    [7:0]    sa20_sr, sa21_sr, sa22_sr, sa23_sr;
wire    [7:0]    sa30_sr, sa31_sr, sa32_sr, sa33_sr;
wire    [7:0]    sa00_mc, sa01_mc, sa02_mc, sa03_mc;
wire    [7:0]    sa10_mc, sa11_mc, sa12_mc, sa13_mc;
wire    [7:0]    sa20_mc, sa21_mc, sa22_mc, sa23_mc;
wire    [7:0]    sa30_mc, sa31_mc, sa32_mc, sa33_mc;
reg        done, ld_r;
reg    [3:0]    dcnt;
 
....................................................................
aes_key_expand_128 u0(
    .clk(        clk    ),
    .kld(        ld    ),
    .key(        key    ),
    .wo_0(        w0    ),
    .wo_1(        w1    ),
    .wo_2(        w2    ),
    .wo_3(        w3    ));
 
aes_sbox us00(    .a(    sa00    ), .d(    sa00_sub    ));
aes_sbox us01(    .a(    sa01    ), .d(    sa01_sub    ));
aes_sbox us02(    .a(    sa02    ), .d(    sa02_sub    ));
aes_sbox us03(    .a(    sa03    ), .d(    sa03_sub    ));
aes_sbox us10(    .a(    sa10    ), .d(    sa10_sub    ));
aes_sbox us11(    .a(    sa11    ), .d(    sa11_sub    ));
aes_sbox us12(    .a(    sa12    ), .d(    sa12_sub    ));
aes_sbox us13(    .a(    sa13    ), .d(    sa13_sub    ));
aes_sbox us20(    .a(    sa20    ), .d(    sa20_sub    ));
aes_sbox us21(    .a(    sa21    ), .d(    sa21_sub    ));
aes_sbox us22(    .a(    sa22    ), .d(    sa22_sub    ));
aes_sbox us23(    .a(    sa23    ), .d(    sa23_sub    ));
aes_sbox us30(    .a(    sa30    ), .d(    sa30_sub    ));
aes_sbox us31(    .a(    sa31    ), .d(    sa31_sub    ));
aes_sbox us32(    .a(    sa32    ), .d(    sa32_sub    ));
aes_sbox us33(    .a(    sa33    ), .d(    sa33_sub    ));
 
endmodule
相关文章
|
2天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
13 1
|
23天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
40 4
|
23天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
27天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现16QAM调制解调通信系统,使用Verilog语言编写,包括信道模块、误码率统计模块。通过设置不同SNR值(如8dB、12dB、16dB),仿真测试系统的误码性能。项目提供了完整的RTL结构图及操作视频,便于理解和操作。核心程序实现了信号的生成、调制、信道传输、解调及误码统计等功能。
38 3
|
4天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了256QAM调制解调算法的仿真效果及理论基础。使用Vivado 2019.2进行仿真,分别在SNR为40dB、32dB和24dB下生成星座图,并导入Matlab进行分析。256QAM通过将8比特数据映射到复平面上的256个点,实现高效的数据传输。Verilog核心程序包括调制、信道噪声添加和解调模块,最终统计误码率。
11 0
|
29天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
24 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
### 简介 本项目采用VIVADO 2019.2进行了十六进制相位移键控(16PSK)算法仿真,结果显示,在SNR=30dB时效果为Tttttttttttttt12,在SNR=20dB时效果为Tttttttttttttt34。系统RTL结构如Tttttttttttttt555555所示。16PSK是一种高效的相位调制技术,能在每个符号时间内传输4比特信息,适用于高速数据传输。其工作原理包括将比特流映射到16个相位状态之一(Tttttttttttttt777777),并通过匹配滤波和决策进行解调。具体Verilog核心程序见完整代码。
30 1
|
1月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
66 0
|
1月前
|
存储 算法 数据处理
基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本系统在原有的8PSK调制解调基础上,新增了高斯信道与误码率统计模块,验证了不同SNR条件下的8PSK性能。VIVADO2019.2仿真结果显示,在SNR分别为30dB、15dB和10dB时,系统表现出不同的误码率和星座图分布。8PSK作为一种高效的相位调制技术,广泛应用于无线通信中。FPGA凭借其高度灵活性和并行处理能力,成为实现此类复杂算法的理想平台。系统RTL结构展示了各模块间的连接与协同工作。
48 16
|
6月前
|
编解码 算法 异构计算
基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序
在Vivado 2019.2和Matlab 2022a中测试的图像质量评估算法展示了效果。该算法基于NC指标,衡量图像与原始图像的相似度,关注分辨率、色彩深度和失真。提供的Verilog代码段用于读取并比较两个BMP文件,计算NC值。

热门文章

最新文章

下一篇
无影云桌面