目錄
1.算法描述
2.仿真效果預(yù)覽
3.verilog核心程序
4.完整verilog
1.算法描述
? ? ? ? ?AES, 高級(jí)加密標(biāo)準(zhǔn), 是采用區(qū)塊加密的一種標(biāo)準(zhǔn), 又稱Rijndael加密法. 嚴(yán)格上來(lái)講, AES和Rijndael又不是完全一樣, AES的區(qū)塊長(zhǎng)度固定為128比特, 秘鑰長(zhǎng)度可以是128, 192或者256. Rijndael加密法可以支持更大范圍的區(qū)塊和密鑰長(zhǎng)度, Rijndael使用的密鑰和區(qū)塊長(zhǎng)度均可以是128,192或256比特. AES是對(duì)稱加密最流行的算法之一.
? ? ? ?AES算法在對(duì)明文加密的時(shí)候,并不是把整個(gè)明文一股腦的加密成一整段密文,而是把明文拆分成一個(gè)個(gè)獨(dú)立的明文塊,每一個(gè)明文塊長(zhǎng)度128bit。這些明文塊經(jīng)過(guò)AES加密器復(fù)雜處理,生成一個(gè)個(gè)獨(dú)立的密文塊,這些密文塊拼接在一起,就是最終的AES加密的結(jié)果。
? ? ? ?但這里涉及到一個(gè)問(wèn)題,假如一段明文長(zhǎng)度是196bit,如果按每128bit一個(gè)明文塊來(lái)拆分的話,第二個(gè)明文塊只有64bit,不足128bit。這時(shí)候怎么辦呢?就需要對(duì)明文塊進(jìn)行填充(Padding) 。
? ? ? ?需要注意的是,如果在AES加密的時(shí)候使用了某一種填充方式,解密的時(shí)候也必須采用同樣的填充方式。
? ? ? ? 殊的加法和乘法。AES 所用的加法和乘法是基于數(shù)學(xué)(譯者注:近世代數(shù))的域論。尤其是 AES 基于有限域GF(2^8)。?
? ? ? ?GF(2^8)由一組從 0x00 到 0xff 的256個(gè)值組成,加上加法和乘法,因此是(2^8)。GF代表伽羅瓦域,以發(fā)明這一理論的數(shù)學(xué)家的名字命名。GF(2^8) 的一個(gè)特性是一個(gè)加法或乘法的操作的結(jié)果必須是在{0x00 ... 0xff}這組數(shù)中。雖然域論是相當(dāng)深?yuàn)W的,但GF(2^8)加法的最終結(jié)果卻很簡(jiǎn)單。GF(2^8) 加法就是異或(XOR)操作。?
? ? ? ? 然而,GF(2^8)的乘法有點(diǎn)繁難。AES的加密和解密例程需要知道怎樣只用七個(gè)常量 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e 來(lái)相乘。所以我不全面介紹GF(2^8)的乘法,而只是針對(duì)這七種特殊情況進(jìn)行說(shuō)明。?
? 在GF(2^8)中用0x01的乘法是特殊的;它相當(dāng)于普通算術(shù)中用1做乘法并且結(jié)果也同樣—任何值乘0x01等于其自身。?
? ? ? ?現(xiàn)在讓我們看看用0x02做乘法。和加法的情況相同,理論是深?yuàn)W的,但最終結(jié)果十分簡(jiǎn)單。只要被乘的值小于0x80,這時(shí)乘法的結(jié)果就是該值左移1比特位。如果被乘的值大于或等于0x80,這時(shí)乘法的結(jié)果就是左移1比特位再用值0x1b異或。它防止了“域溢出”并保持乘法的乘積在范圍以內(nèi)。?
? ? ? ?一旦你在GF(2^8)中用0x02建立了加法和乘法,你就可以用任何常量去定義乘法。用0x03做乘法時(shí),你可以將 0x03 分解為2的冪之和。為了用 0x03 乘以任意字節(jié)b, 因?yàn)?0x03 = 0x02 + 0x01,因此:?
b * 0x03 = b * (0x02 + 0x01) = (b * 0x02) + (b * 0x01)
? ? ? ?這是可以行得通的,因?yàn)槟阒廊绾斡?0x02 和 0x01 相乘和相加,同理,用0x0d去乘以任意字節(jié)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做的乘法是一個(gè)有條件的左移1比特位。AES規(guī)范中包括大量有關(guān)GF(2^8)操作的附加信息。
? ? ? ? ?密鑰是AES算法實(shí)現(xiàn)加密和解密的根本。對(duì)稱加密算法之所以對(duì)稱,是因?yàn)檫@類算法對(duì)明文的加密和解密需要使用同一個(gè)密鑰。
AES支持三種長(zhǎng)度的密鑰: 128位,192位,256位
? ? ? ? 平時(shí)大家所說(shuō)的AES128,AES192,AES256,實(shí)際上就是指AES算法對(duì)不同長(zhǎng)度密鑰的使用。三種密鑰的區(qū)別:
? ? ? ? ?從安全性來(lái)看,AES256安全性最高。從性能看,AES128性能最高。本質(zhì)原因是它們的加密處理輪數(shù)不同。
? ? ? ? AES原理:AES是對(duì)數(shù)據(jù)按128位,也就是16個(gè)字節(jié)進(jìn)行分組進(jìn)行加密的,每次對(duì)一組數(shù)據(jù)加密需要運(yùn)行多輪,而輸入密鑰的長(zhǎng)度可以為128、192和256位,也就是16個(gè)字節(jié)、24個(gè)字節(jié)和32個(gè)字節(jié),如果用戶輸入的密鑰長(zhǎng)度不是這幾種長(zhǎng)度,也會(huì)補(bǔ)成這幾種長(zhǎng)度。
無(wú)論輸入密鑰是多少字節(jié),加密還是以16字節(jié)的數(shù)據(jù)一組來(lái)進(jìn)行的,密鑰長(zhǎng)度的不同僅僅影響加密運(yùn)行的輪數(shù)。
? ? ? ? ?AES算法是一個(gè)對(duì)稱分組密碼算法。數(shù)據(jù)分組長(zhǎng)度必須是 128 bits,使用的密鑰長(zhǎng)度為 128,192 或 256 bits。對(duì)于三種不同密鑰長(zhǎng)度的 AES 算法,分別稱為“AES-128”、“AES-192”、“AES-256”。AES加密算法涉及4種操作:字節(jié)替代(SubBytes)、行移位(ShiftRows)、列混(MixColumns)和輪密鑰加(AddRoundKey)。
?? ? ? ? ?從AES的加密和解密的流程圖中可知:解密算法的每一步分別對(duì)應(yīng)加密算法的逆操作。加解密所有操作的順序正好是相反的,正是這樣才保證了算法的正確性。加解密中每輪的密鑰分別由種子密鑰經(jīng)過(guò)密鑰擴(kuò)展算法得到,算法中16字節(jié)的明文、密文和輪子密鑰都以一個(gè)4x4的矩陣表示。
?
2.仿真效果預(yù)覽
vivado2019.2仿真結(jié)果如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-427188.html
3.verilog核心程序
...........................................................................
wire [31:0] w0, w1, w2, w3;
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
A268
4.完整verilog
V文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-427188.html
到了這里,關(guān)于基于FPGA的AES加密解密vivado仿真,verilog開發(fā),包含testbench的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!