本設(shè)計實(shí)現(xiàn)AES加密算法為ecb模式,填充模式未設(shè)置,同時支持AES-128/192/256三種密鑰長度。代碼完全開源,開源鏈接在文章末尾。
1.文件架構(gòu)
下圖為GitHub倉庫中上傳的文件第一級結(jié)構(gòu),第一級為matlab和user,matlab中存儲的是在進(jìn)行列混淆運(yùn)算時查表所用的coe文件,這些文件用來初始化vivado中的bram IP以便于查表運(yùn)算。

user
ip:存放使用到的Xilinx ip文件;
src:存放算法設(shè)計的Verilog文件;
sim:存放仿真文件。matlab
gen_coe.m:用于產(chǎn)生對應(yīng)的coe文件
*.coe:用于初始化IP。
2.代碼說明以及仿真結(jié)果
2.1 代碼結(jié)構(gòu)
為了方便進(jìn)行上板驗(yàn)證,在設(shè)計時我使用串口進(jìn)行了代碼的封裝,因此頂層文件top中添加了串口以及串口協(xié)議解析的部分代碼,這些代碼是和aes算法本身沒有關(guān)系的,所以可以直接忽略。aes算法的核心應(yīng)該是aes_core以及它的子文件。
top
key_filter:按鍵濾波接入外部控制信號(與aes算法無關(guān),建議忽略);
uart_aes_packed:次頂層,該部分將aes代碼和串口解析代碼以及串口接口封裝到了一起(與aes算法無關(guān),建議忽略);串口解析部分:這部分代碼沒有封裝成子模塊,直接在uart_aes_packed文件中編寫,這個部分的任務(wù)主要是將接收到的串口數(shù)據(jù)解析為密鑰或者明文,比如我設(shè)定首先連續(xù)接收到“key”字符表示數(shù)據(jù)為密鑰,然后下一個字符為“a/b/c”分別來指代當(dāng)前的密鑰長度為128/192/256bit三種模式。
uart_tx/rx:串口接收發(fā)送模塊;
aes_core:aes算法頂層代碼。該部分代碼為實(shí)現(xiàn)重點(diǎn)。aes_key_expasion:密鑰拓展模塊,實(shí)現(xiàn)同時支持AES128/192/256三種密鑰長度的密鑰拓展。
aes_sbox:實(shí)現(xiàn)同時支持4byte的S盒替換。
aes_encipher:加密模塊,實(shí)現(xiàn)分別支持三種密鑰長度的aes加密;
aes_sbox_128:實(shí)現(xiàn)同時支持16byte的S盒替換;
aes_col_mux:實(shí)現(xiàn)列混淆計算;
輪密鑰加和行移位較為簡單,直接在代碼中實(shí)現(xiàn)未單獨(dú)寫為v文件。aes_decipher:解密模塊,實(shí)現(xiàn)分別支持三種密鑰長度的aes解密。
aes_inv_sbox_128:實(shí)現(xiàn)同時支持16byte的逆S盒替換;
aes_inv_col_mix:實(shí)現(xiàn)逆列混淆計算。

2.2 代碼仿真結(jié)果
2.2.1 密鑰拓展模塊仿真



2.2.2 加密模塊仿真



2.2.3 解密模塊仿真

2.2.4 整體結(jié)果仿真(包含串口解析以及串口收發(fā)部分)

2.3 上板驗(yàn)證結(jié)果
開發(fā)板板連接
串口發(fā)送的密鑰流
串口發(fā)送的明文流
接收到的密文和仿真結(jié)果密文對比
接收到的解密結(jié)果
2.4 資源消耗
aes_core的資源消耗(在vivado 2023.2平臺下,器件為zynq7020的情況下的綜合結(jié)果)
2.5 接口說明
密鑰拓展模塊
module aes_key_expasion
(
input wire clk ,
input wire rst ,
input wire [ 255:0] key_in ,//*按有可能輸入的最大值來輸入(256bit)
input wire [ 1:0] keylen ,//*0 1 2
input wire init ,//*indicate the initial key is ready
input wire [ 3:0] round ,//*indicate the current round
output wire [ 127:0] round_key ,//*output the round key
output wire key_ready ,//密鑰拓展完成信號
output wire [ 3:0] round_num //表明當(dāng)前的加密模式總共有多少輪
);
加密模塊
module aes_encipher (
input wire clk,
input wire rst,
input wire next,//開始工作信號,表明明文準(zhǔn)備完畢
input wire [3:0] round_num,//需要加密的輪數(shù),表示不同的密鑰長度
input wire key_ready,//密鑰準(zhǔn)備完成信號
input wire [127:0] round_key,//輪密鑰
output reg [3:0] round,//當(dāng)前輪
input wire [127:0] plain,//輸入明文
output reg [127:0] cipher,//輸出密文
output reg cipher_ready,//加密完成標(biāo)志
output wire error //*密鑰未生成,收到了加密信號
);
解密模塊文章來源:http://www.zghlxwxcb.cn/news/detail-801693.html
與加密模塊基本相同
https://github.com/MaxWei250/aes_fpga 代碼地址
如有幫助希望可以star??文章來源地址http://www.zghlxwxcb.cn/news/detail-801693.html
到了這里,關(guān)于AES算法基于FPGA的硬件實(shí)現(xiàn)(3)AES算法的Verilog實(shí)現(xiàn)(完結(jié))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!