目錄
1.課題概述
2.系統測試效果
3.核心程序與模型
4.系統原理簡介
4.1 字節替換(SubBytes)
4.2 行移位(ShiftRows)
4.3 列混合(MixColumns)
4.4 輪密鑰加(AddRoundKey)
4.5 逆字節替換(InvSubBytes)
4.6 逆行移位(InvShiftRows)
4.7 逆列混合(InvMixColumns)
4.8 輪密鑰加(AddRoundKey)
5.完整工程文件
1.課題概述
? ? ? ?基于FPGA的AES加解密系統verilog實現,包含testbench和開發板硬件測試。輸入待加密數據,密鑰,輸出加密數據,然后通過解密模塊輸出解密后的原數據。
2.系統測試效果
仿真測試
硬件測試
在實際測試過程中,如果你的開發板和我的不一樣,可以參考本博客置頂文章進行硬件配置修改:
FPGA系統開發板調試過程不同芯片的移植步驟介紹_紫光fpga移植軟核的步驟-CSDN博客
通過這個鏈接的步驟,可以實現不同開發板上的系統調試。
3.核心程序與模型
版本:vivado2022.2
`timescale 1ns / 1psmodule tops_hw(
input i_clk,
input i_rst,
output led);reg[15:0]cnt;
always @(posedge i_clk or negedge i_rst)
beginif(~i_rst)begincnt<=16'd0;end elsebeginif(cnt==16'd60000)cnt<=16'd1;elsecnt<=cnt+16'd1;end
endreg start;
reg[127:0]key;
reg[127:0]text_in; always @(posedge i_clk or negedge i_rst)
beginif(~i_rst)beginstart <=1'd0;key <=128'd0;text_in <=128'd0;end elsebeginif(cnt==16'd1 | cnt==16'd20001 | cnt==16'd40001)start <=1'd1;elsestart <=1'd0;if(cnt==16'd1)begintext_in <= 128'h0123_4567_89ab_cdef_0123_4567_89ab_cdef;key <= 128'h0000_0000_0000_0000_1111_0000_0000_0000;endif(cnt==16'd20001)begintext_in <= 128'h0123_4567_0000_cdef_0123_4567_89ab_cdef;key <= 128'h0000_0000_1111_0000_1111_0000_0000_0000;endif(cnt==16'd40001)begintext_in <= 128'h0123_4560_0000_c11f_0123_4567_89ab_cdef;key <= 128'h0000_0000_1111_0000_1111_0000_0111_0000;endend
endwire done;
wire [127:0] text_out;
wire done2;
wire [127:0] text_out2;aes_tops aes_tops_jiam(.Clock (i_clk),.Reset (~i_rst),.loads (start),.enc_dec (1'b0),.din (text_in),.FEK (key),.Ready (),.dout (),.Ready_Valid (done),.douts_Valid (text_out));aes_tops aes_tops_jiem(.Clock (i_clk),.Reset (~i_rst),.loads (done),.enc_dec (1'b1),.din (text_out),.FEK (key),.Ready (),.dout (),.Ready_Valid (done2),.douts_Valid (text_out2));assign led= done2;ila_0 your_instance_name (.clk(i_clk), // input wire clk.probe0({start,text_in,key,done,text_out,done2,text_out2}) // input wire [519:0] probe0
);endmodule
00X6_002m
4.系統原理簡介
? ? ? ?AES是一種分組密碼算法,它將明文數據分成固定大小的分組(通常為 128 位),并使用一個密鑰對這些分組進行加密。AES支持的密鑰長度有128位、192位和256位,不同的密鑰長度對應不同的加密輪數,分別為10輪、12輪和14輪。
? ? ? ?AES加密過程主要包括初始輪、多輪迭代和最終輪。每一輪迭代都包含四個基本操作:字節替換(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)和輪密鑰加(AddRoundKey)。
4.1 字節替換(SubBytes)
? ? ? 字節替換操作是一個非線性替換操作,它將狀態矩陣中的每個字節通過一個固定的S盒進行替換。S 盒是一個16×16的字節替換表,它是通過有限域GF (2^8)上的逆運算和仿射變換得到的。數學公式為:
4.2 行移位(ShiftRows)
? ? ? ?行移位操作將狀態矩陣的每一行循環左移不同的位數。第一行保持不變,第二行左移1個字節,第三行左移2個字節,第四行左移3個字節。數學公式為:
4.3 列混合(MixColumns)
? ? ? ?列混合操作是一個線性變換,它將狀態矩陣的每一列與一個固定的矩陣進行矩陣乘法運算。這個固定矩陣是在有限域GF (2^8)上定義的。數學公式為:
4.4 輪密鑰加(AddRoundKey)
輪密鑰加操作將狀態矩陣與當前輪的輪密鑰進行逐位異或運算。數學公式為:
? ? ? ? AES解密過程是加密過程的逆過程,它包括初始輪、多輪迭代和最終輪。每一輪迭代包含逆字節替換(InvSubBytes)、逆行移位(InvShiftRows)、逆列混合(InvMixColumns)和輪密鑰加(AddRoundKey)。
4.5 逆字節替換(InvSubBytes)
逆字節替換操作是字節替換操作的逆操作,它使用逆S盒進行替換。數學公式為:
4.6 逆行移位(InvShiftRows)
逆行移位操作是行移位操作的逆操作,它將狀態矩陣的每一行循環右移不同的位數。數學公式為:
4.7 逆列混合(InvMixColumns)
? ? ? 逆列混合操作是列混合操作的逆操作,它將狀態矩陣的每一列與一個固定的逆矩陣進行矩陣乘法運算。數學公式為:
4.8 輪密鑰加(AddRoundKey)
輪密鑰加操作與加密過程中的輪密鑰加操作相同,都是逐位異或運算。
5.完整工程文件
v