logo资料库

AES加密解密verilog代码.pdf

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
顶层代码 ` include "timescale.v" module aes_top(clk, rst, kld, sel,ld, done, key, text_in, text_out ); input clk, rst; input kld, ld,sel; output done; input [127:0] input [127:0] output key; text_in; text_out; [127:0] reg[31:0] wk0, wk1, wk2, wk3; wire [31:0] w0, w1, w2, w3; reg reg reg text_in_r; text_out; [127:0] [127:0] [31:0] w_k0,w_k1,w_k2,w_k3; reg reg reg reg [7:0] sa00, sa01, sa02, sa03; [7:0] sa10, sa11, sa12, sa13; [7:0] sa20, sa21, sa22, sa23; [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_ark, sa01_ark, sa02_ark, sa03_ark; wire [7:0] sa10_ark, sa11_ark, sa12_ark, sa13_ark; wire [7:0] sa20_ark, sa21_ark, sa22_ark, sa23_ark; wire [7:0] sa30_ark, sa31_ark, sa32_ark, sa33_ark; [3:0] dcnt; ld_r, done; reg reg reg //shangsheng 'go' always @(posedge clk) go=0; if(!rst) else if(sel) else if(done) go <= #1 1'b0; go <= #1 1'b1; go <= #1 1'b0; always @(posedge clk) if(!rst) else if(done) else if(ld) dcnt <= #1 4'h0; dcnt <= #1 4'h0; dcnt <= #1 4'h1;
else if(go) dcnt <= #1 dcnt + 4'h1; always @(posedge clk) done <= #1 (dcnt==4'hb) & !ld; always @(posedge clk) //read if(ld) text_in_r <= #1 text_in; ld_r <= #1 ld; sa33 <= #1 ld_r ? text_in_r[007:000] ^ w3[07:00] : sa33_next; sa23 <= #1 ld_r ? text_in_r[015:008] ^ w3[15:08] : sa23_next; sa13 <= #1 ld_r ? text_in_r[023:016] ^ w3[23:16] : sa13_next; sa03 <= #1 ld_r ? text_in_r[031:024] ^ w3[31:24] : sa03_next; sa32 <= #1 ld_r ? text_in_r[039:032] ^ w2[07:00] : sa32_next; sa22 <= #1 ld_r ? text_in_r[047:040] ^ w2[15:08] : sa22_next; sa12 <= #1 ld_r ? text_in_r[055:048] ^ w2[23:16] : sa12_next; sa02 <= #1 ld_r ? text_in_r[063:056] ^ w2[31:24] : sa02_next; sa31 <= #1 ld_r ? text_in_r[071:064] ^ w1[07:00] : sa31_next; sa21 <= #1 ld_r ? text_in_r[079:072] ^ w1[15:08] : sa21_next; sa11 <= #1 ld_r ? text_in_r[087:080] ^ w1[23:16] : sa11_next; sa01 <= #1 ld_r ? text_in_r[095:088] ^ w1[31:24] : sa01_next; sa30 <= #1 ld_r ? text_in_r[103:096] ^ w0[07:00] : sa30_next; sa20 <= #1 ld_r ? text_in_r[111:104] ^ w0[15:08] : sa20_next; sa10 <= #1 ld_r ? text_in_r[119:112] ^ w0[23:16] : sa10_next; sa00 <= #1 ld_r ? text_in_r[127:120] ^ w0[31:24] : sa00_next; always @(posedge clk) //ld 为 1 时 text_in 与初始密钥异或, ld 为 0 时等于 saxx_next always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) always @(posedge clk) // 's' replace and assign sa00_sr = sa00_sub; assign sa01_sr = sa01_sub; assign sa02_sr = sa02_sub; assign sa03_sr = sa03_sub; assign sa10_sr = !go ? sa13_sub:sa11_sub; assign sa11_sr = !go ? sa10_sub:sa12_sub; assign sa12_sr = !go ? sa11_sub:sa13_sub; assign sa13_sr = !go ? sa12_sub:sa10_sub; assign sa20_sr = !go ? sa22_sub:sa22_sub; assign sa21_sr = !go ? sa23_sub:sa23_sub; assign sa22_sr = !go ? sa20_sub:sa20_sub; assign sa23_sr = !go ? sa21_sub:sa21_sub; assign sa30_sr = !go ? sa31_sub:sa33_sub; assign sa31_sr = !go ? sa32_sub:sa30_sub; assign sa32_sr = !go ? sa33_sub:sa31_sub; assign sa33_sr = !go ? sa30_sub:sa32_sub; //hun he bian huan assign {sa00_ark, sa10_ark, sa20_ark, sa30_ark} inv_mix_col(sa00_sr,sa10_sr,sa20_sr,sa30_sr); assign {sa01_ark, sa11_ark, sa21_ark, sa31_ark} inv_mix_col(sa01_sr,sa11_sr,sa21_sr,sa31_sr); assign {sa02_ark, sa12_ark, sa22_ark, sa32_ark} inv_mix_col(sa02_sr,sa12_sr,sa22_sr,sa32_sr); assign {sa03_ark, sa13_ark, sa23_ark, sa33_ark} inv_mix_col(sa03_sr,sa13_sr,sa23_sr,sa33_sr); //next cipter assign sa00_next = go ? sa00_ark ^ w0[31:24]:sa00_ark ^ wk0[31:24]; assign sa01_next = go ? sa01_ark ^ w1[31:24]:sa01_ark ^ wk1[31:24]; assign sa02_next = go ? sa02_ark ^ w2[31:24]:sa02_ark ^ wk2[31:24]; assign sa03_next = go ? sa03_ark ^ w3[31:24]:sa03_ark ^ wk3[31:24]; = go ? mix_col(sa00_sr,sa10_sr,sa20_sr,sa30_sr): = go ? mix_col(sa01_sr,sa11_sr,sa21_sr,sa31_sr): = go ? mix_col(sa02_sr,sa12_sr,sa22_sr,sa32_sr): = go ? mix_col(sa03_sr,sa13_sr,sa23_sr,sa33_sr):
assign sa10_next = go ? sa10_ark ^ w0[23:16]:sa10_ark ^ wk0[23:16]; assign sa11_next = go ? sa11_ark ^ w1[23:16]:sa11_ark ^ wk1[23:16]; assign sa12_next = go ? sa12_ark ^ w2[23:16]:sa12_ark ^ wk2[23:16]; assign sa13_next = go ? sa13_ark ^ w3[23:16]:sa13_ark ^ wk3[23:16]; assign sa20_next = go ? sa20_ark ^ w0[15:08]:sa20_ark ^ wk0[15:08]; assign sa21_next = go ? sa21_ark ^ w1[15:08]:sa21_ark ^ wk1[15:08]; assign sa22_next = go ? sa22_ark ^ w2[15:08]:sa22_ark ^ wk2[15:08]; assign sa23_next = go ? sa23_ark ^ w3[15:08]:sa23_ark ^ wk3[15:08]; assign sa30_next = go ? sa30_ark ^ w0[07:00]:sa30_ark ^ wk0[07:00]; assign sa31_next = go ? sa31_ark ^ w1[07:00]:sa31_ark ^ wk1[07:00]; assign sa32_next = go ? sa32_ark ^ w2[07:00]:sa32_ark ^ wk2[07:00]; assign sa33_next = go ? sa33_ark ^ w3[07:00]:sa33_ark ^ wk3[07:00]; // output always @(posedge clk) text_out[127:120] <=#1 go ? sa00_sr ^ w0[31:24]:sa00_sr ^ wk0[31:24]; always @(posedge clk) text_out[095:088] <=#1 go ? sa01_sr ^ w1[31:24]:sa01_sr ^ wk1[31:24]; always @(posedge clk) text_out[063:056] <=#1 go ? sa02_sr ^ w2[31:24]:sa02_sr ^ wk2[31:24]; always @(posedge clk) text_out[031:024] <=#1 go ? sa03_sr ^ w3[31:24]:sa03_sr ^ wk3[31:24]; always @(posedge clk) text_out[119:112] <=#1 go ? sa10_sr ^ w0[23:16]:sa10_sr ^ wk0[23:16]; always @(posedge clk) text_out[087:080] <=#1 go ? sa11_sr ^ w1[23:16]:sa11_sr ^ wk1[23:16]; always @(posedge clk) text_out[055:048] <=#1 go ? sa12_sr ^ w2[23:16]:sa12_sr ^ wk2[23:16]; always @(posedge clk) text_out[023:016] <=#1 go ? sa13_sr ^ w3[23:16]:sa13_sr ^ wk3[23:16]; always @(posedge clk) text_out[111:104] <=#1 go ? sa20_sr ^ w0[15:08]:sa20_sr ^ wk0[15:08]; always @(posedge clk) text_out[079:072] <=#1 go ? sa21_sr ^ w1[15:08]:sa21_sr ^ wk1[15:08]; always @(posedge clk) text_out[047:040] <=#1 go ? sa22_sr ^ w2[15:08]:sa22_sr ^ wk2[15:08]; always @(posedge clk) text_out[015:008] <=#1 go ? sa23_sr ^ w3[15:08]:sa23_sr ^ wk3[15:08]; always @(posedge clk) text_out[103:096] <=#1 go ? sa30_sr ^ w0[07:00]:sa30_sr ^ wk0[07:00]; always @(posedge clk) text_out[071:064] <=#1 go ? sa31_sr ^ w1[07:00]:sa31_sr ^ wk1[07:00]; always @(posedge clk) text_out[039:032] <=#1 go ? sa32_sr ^ w2[07:00]:sa32_sr ^ wk2[07:00]; always @(posedge clk) text_out[007:000] <=#1 go ? sa33_sr ^ w3[07:00]:sa33_sr ^ wk3[07:00]; reg reg reg reg [127:0] [3:0] kcnt; kb[10:0]; kdone; kb_ld; always @(posedge clk) kcnt <= #1 4'ha; if(!rst) else if(kld) else if(kb_ld) kcnt <= #1 kcnt - 4'h1; kcnt <= #1 4'ha; always @(posedge clk) kb_ld <= #1 1'b0; if(!rst) else if(kld) else if(kcnt==4'h0) kb_ld <= #1 1'b0; kb_ld <= #1 1'b1; kdone <= #1 (kcnt==4'h0) & !kld; if(kb_ld) kb[kcnt] <= #1 inv_mix_col(w3, w2, w1, w0); {w_k3,w_k2,w_k1,w_k0} <= #1 kb[dcnt]; always @(posedge clk) always @(posedge clk) always @(posedge clk) always {wk3[31:24],wk2[31:24],wk1[31:24],wk0[31:24]}<=inv_mix_col(w_k3[31:24],w_k2[31:24],w_k1[31:24],w_k0 [31:24]); always {wk3[23:16],wk2[23:16],wk1[23:16],wk0[23:16]}<=inv_mix_col(w_k3[23:16],w_k2[23:16],w_k1[23:16],w_k0 [23:16]); @(posedge @(posedge clk) clk)
always {wk3[15:8],wk2[15:8],wk1[15:8],wk0[15:8]}<=inv_mix_col(w_k3[15:8],w_k2[15:8],w_k1[15:8],w_k0[15:8]); always {wk3[7:0],wk2[7:0],wk1[7:0],wk0[7:0]}<=inv_mix_col(w_k3[7:0],w_k2[7:0],w_k1[7:0],w_k0[7:0]); aes_key_expand_128 u0( @(posedge @(posedge clk) clk) .clk( .kld( .key( .wo_0( .wo_1( .wo_2( .wo_3( clk kld key ), ), ), w0 w1 w2 w3 ), ), ), )); .s(go), .s(go), .a( sa00 ), .a( sa01 ), sa00_sub )); sa01_sub )); .d( .d( .d( sa02_sub )); .d( sa03_sub )); .d( sa10_sub )); .d( sa11_sub )); .d( sa12_sub )); .d( sa13_sub )); .d( sa20_sub )); .d( sa21_sub )); .d( sa22_sub )); .d( sa23_sub )); .d( sa30_sub )); .d( sa31_sub )); .d( sa32_sub )); .d( sa33_sub )); //逆 s 盒代替 sbox us00( sbox us01( sbox us02( .s(go), .a( sa02 ), sbox us03( .s(go), .a( sa03 ), sbox us10( .s(go), .a( sa10 ), sbox us11( .s(go), .a( sa11 ), sbox us12( .s(go), .a( sa12 ), sbox us13( .s(go), .a( sa13 ), sbox us20( .s(go), .a( sa20 ), sbox us21( .s(go), .a( sa21 ), sbox us22( .s(go), .a( sa22 ), sbox us23( .s(go), .a( sa23 ), sbox us30( .s(go), .a( sa30 ), sbox us31( .s(go), .a( sa31 ), sbox us32( .s(go), .a( sa32 ), sbox us33( .s(go), .a( sa33 ), //hun he bian huan han shu function [31:0] mix_col; input [7:0] s0,s1,s2,s3; reg begin mix_col[31:24]=xtime(s0)^xtime(s1)^s1^s2^s3; mix_col[23:16]=s0^xtime(s1)^xtime(s2)^s2^s3; mix_col[15:08]=s0^s1^xtime(s2)^xtime(s3)^s3; mix_col[07:00]=xtime(s0)^s0^s1^s2^xtime(s3); end endfunction [7:0] s0_o,s1_o,s2_o,s3_o; function [7:0] xtime; input [7:0] b; xtime={b[6:0],1'b0}^(8'h1b&{8{b[7]}}); endfunction //逆列混合变换函数 function [31:0] inv_mix_col; input [7:0] s0,s1,s2,s3; begin inv_mix_col[31:24]=pmul_e(s0)^pmul_b(s1)^pmul_d(s2)^pmul_9(s3); inv_mix_col[23:16]=pmul_9(s0)^pmul_e(s1)^pmul_b(s2)^pmul_d(s3); inv_mix_col[15:08]=pmul_d(s0)^pmul_9(s1)^pmul_e(s2)^pmul_b(s3); inv_mix_col[07:00]=pmul_b(s0)^pmul_d(s1)^pmul_9(s2)^pmul_e(s3); end endfunction function [7:0] pmul_e; input [7:0] b; reg [7:0] two,four,eight;
begin two=xtime(b);four=xtime(two);eight=xtime(four);pmul_e=eight^four^two; end endfunction function [7:0] pmul_9; input [7:0] b; reg [7:0] two,four,eight; begin two=xtime(b);four=xtime(two);eight=xtime(four);pmul_9=eight^b; end endfunction function [7:0] pmul_d; input [7:0] b; reg [7:0] two,four,eight; begin two=xtime(b);four=xtime(two);eight=xtime(four);pmul_d=eight^four^b; end endfunction function [7:0] pmul_b; input [7:0] b; reg [7:0] two,four,eight; begin two=xtime(b);four=xtime(two);eight=xtime(four);pmul_b=eight^two^b; end endfunction endmodule S 盒 module sbox(s,a,d); input input output reg [7:0] d; [7:0] a; s; [7:0] d; always @(a) if(s) case(a) 8'h00: d=8'h52; 8'h01: d=8'h09; 8'h02: d=8'h6a; 8'h03: d=8'hd5; 8'h04: d=8'h30; 8'h05: d=8'h36; 8'h06: d=8'ha5; 8'h07: d=8'h38; 8'h08: d=8'hbf; 8'h09: d=8'h40; 8'h0a: d=8'ha3; 8'h0b: d=8'h9e;
8'h0c: d=8'h81; 8'h0d: d=8'hf3; 8'h0e: d=8'hd7; 8'h0f: d=8'hfb; 8'h10: d=8'h7c; 8'h11: d=8'he3; 8'h12: d=8'h39; 8'h13: d=8'h82; 8'h14: d=8'h9b; 8'h15: d=8'h2f; 8'h16: d=8'hff; 8'h17: d=8'h87; 8'h18: d=8'h34; 8'h19: d=8'h8e; 8'h1a: d=8'h43; 8'h1b: d=8'h44; 8'h1c: d=8'hc4; 8'h1d: d=8'hde; 8'h1e: d=8'he9; 8'h1f: d=8'hcb; 8'h20: d=8'h54; 8'h21: d=8'h7b; 8'h22: d=8'h94; 8'h23: d=8'h32; 8'h24: d=8'ha6; 8'h25: d=8'hc2; 8'h26: d=8'h23; 8'h27: d=8'h3d; 8'h28: d=8'hee; 8'h29: d=8'h4c; 8'h2a: d=8'h95; 8'h2b: d=8'h0b; 8'h2c: d=8'h42; 8'h2d: d=8'hfa; 8'h2e: d=8'hc3; 8'h2f: d=8'h4e; 8'h30: d=8'h08; 8'h31: d=8'h2e; 8'h32: d=8'ha1; 8'h33: d=8'h66; 8'h34: d=8'h28; 8'h35: d=8'hd9; 8'h36: d=8'h24; 8'h37: d=8'hb2; 8'h38: d=8'h76; 8'h39: d=8'h5b; 8'h3a: d=8'ha2; 8'h3b: d=8'h49; 8'h3c: d=8'h6d; 8'h3d: d=8'h8b;
8'h3e: d=8'hd1; 8'h3f: d=8'h25; 8'h40: d=8'h72; 8'h41: d=8'hf8; 8'h42: d=8'hf6; 8'h43: d=8'h64; 8'h44: d=8'h86; 8'h45: d=8'h68; 8'h46: d=8'h98; 8'h47: d=8'h16; 8'h48: d=8'hd4; 8'h49: d=8'ha4; 8'h4a: d=8'h5c; 8'h4b: d=8'hcc; 8'h4c: d=8'h5d; 8'h4d: d=8'h65; 8'h4e: d=8'hb6; 8'h4f: d=8'h92; 8'h50: d=8'h6c; 8'h51: d=8'h70; 8'h52: d=8'h48; 8'h53: d=8'h50; 8'h54: d=8'hfd; 8'h55: d=8'hed; 8'h56: d=8'hb9; 8'h57: d=8'hda; 8'h58: d=8'h5e; 8'h59: d=8'h15; 8'h5a: d=8'h46; 8'h5b: d=8'h57; 8'h5c: d=8'ha7; 8'h5d: d=8'h8d; 8'h5e: d=8'h9d; 8'h5f: d=8'h84; 8'h60: d=8'h90; 8'h61: d=8'hd8; 8'h62: d=8'hab; 8'h63: d=8'h00; 8'h64: d=8'h8c; 8'h65: d=8'hbc; 8'h66: d=8'hd3; 8'h67: d=8'h0a; 8'h68: d=8'hf7; 8'h69: d=8'he4; 8'h6a: d=8'h58; 8'h6b: d=8'h05; 8'h6c: d=8'hb8; 8'h6d: d=8'hb3; 8'h6e: d=8'h45; 8'h6f: d=8'h06;
8'h70: d=8'hd0; 8'h71: d=8'h2c; 8'h72: d=8'h1e; 8'h73: d=8'h8f; 8'h74: d=8'hca; 8'h75: d=8'h3f; 8'h76: d=8'h0f; 8'h77: d=8'h02; 8'h78: d=8'hc1; 8'h79: d=8'haf; 8'h7a: d=8'hbd; 8'h7b: d=8'h03; 8'h7c: d=8'h01; 8'h7d: d=8'h13; 8'h7e: d=8'h8a; 8'h7f: d=8'h6b; 8'h80: d=8'h3a; 8'h81: d=8'h91; 8'h82: d=8'h11; 8'h83: d=8'h41; 8'h84: d=8'h4f; 8'h85: d=8'h67; 8'h86: d=8'hdc; 8'h87: d=8'hea; 8'h88: d=8'h97; 8'h89: d=8'hf2; 8'h8a: d=8'hcf; 8'h8b: d=8'hce; 8'h8c: d=8'hf0; 8'h8d: d=8'hb4; 8'h8e: d=8'he6; 8'h8f: d=8'h73; 8'h90: d=8'h96; 8'h91: d=8'hac; 8'h92: d=8'h74; 8'h93: d=8'h22; 8'h94: d=8'he7; 8'h95: d=8'had; 8'h96: d=8'h35; 8'h97: d=8'h85; 8'h98: d=8'he2; 8'h99: d=8'hf9; 8'h9a: d=8'h37; 8'h9b: d=8'he8; 8'h9c: d=8'h1c; 8'h9d: d=8'h75; 8'h9e: d=8'hdf; 8'h9f: d=8'h6e; 8'ha0: d=8'h47; 8'ha1: d=8'hf1;
分享到:
收藏