DES算法的verilog实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

E D A试验报告
一、实验项目名称
DES算法
二、实验目的与要求
1.掌握DES的原理和设计方法。

2.了解QuartusII硬件电路设计流程,学会利用Modelsim进行仿真。

3.加深对自顶向下设计和分模块化的了解,学会模块化的设计方法。

三、实验步骤
(一).DES算法原理
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。

明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

其入口参数有三个:key、data、mode。

key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。

当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于
对数据解密。

实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:
(二)、VerilogHDL实现原理
拟采用模块化设计思想,根据DES算法的流程分模块设计实现各模块,自顶向下最终实现DES加密算法。

各模块功能及实现如下所示:
1.整体结构框架搭建,实现总体功能
moduleDES(inputclk,
inputdes_enable,
inputreset,
inputdes_mode,
input[1:64]data_i,
input[1:64]key_i,
outputwire[1:64]data_o,
outputready_o);
wire[3:0]inter_num_curr;
wire[1:32]R_i_var,L_i_var;
wire[1:56]Key_i_var_out;
wire[1:64]data_o_var_t;
wire[1:32]R_i,L_i;
wire[1:32]R_o,L_o;
wire[1:56]Key_o;
wire[1:28]C0,D0;
IPIP1(.in(data_i),
.L_i_var(L_i_var),
.R_i_var(R_i_var));
IP_niIP_ni(.in(data_o_var_t),
.out(data_o));
pc_1pc_1(.key_i(key_i),
.C0(C0),
.D0(D0));
//F(R,K)
des_fdes_f1(.clk(clk),
.reset(reset),
.des_mode(des_mode),
.inter_num_i(inter_num_curr),
.R_i(R_i),
.L_i(L_i),
.Key_i(Key_i_var_out),
.R_o(R_o),.L_o(L_o),
.Key_o(Key_o));
//contral16F(R,K)
contrlcontrl1(.data_o_var_t(data_o_var_t),
.inter_num_curr(inter_num_curr),
.Key_i_var_out(Key_i_var_out),
.R_i(R_i),
.L_i(L_i),
.ready_o(ready_o),
.L_o(L_o),
.R_o(R_o),
.R_i_var(R_i_var),
.L_i_var(L_i_var),
.Key_o(Key_o),
.C0(C0),
.D0(D0),
.clk(clk),
.reset(reset),
.des_enable(des_enable));
endmodule
moduleIP(input[1:64]in,
output[1:32]L_i_var,
output[1:32]R_i_var);
assign{L_i_var,R_i_var}=
{in[58],in[50],in[42],in[34],in[26],in[18],in[10],in[2],
in[60],in[52],in[44],in[36],in[28],in[20],in[12],in[4],
in[62],in[54],in[46],in[38],in[30],in[22],in[14],in[6],
in[64],in[56],in[48],in[40],in[32],in[24],in[16],in[8],
in[57],in[49],in[41],in[33],in[25],in[17],in[9],in[1],
in[59],in[51],in[43],in[35],in[27],in[19],in[11],in[3],
in[61],in[53],in[45],in[37],in[29],in[21],in[13],in[5],
in[63],in[55],in[47],in[39],in[31],in[23],in[15],in[7]}; endmodule
moduleIP_ni(input[1:64]in,
output[1:64]out);
assignout=
{in[40],in[8],in[48],in[16],in[56],in[24],in[64],in[32],
in[39],in[7],in[47],in[15],in[55],in[23],in[63],in[31],
in[38],in[6],in[46],in[14],in[54],in[22],in[62],in[30],
in[37],in[5],in[45],in[13],in[53],in[21],in[61],in[29],
in[36],in[4],in[44],in[12],in[52],in[20],in[60],in[28],
in[35],in[3],in[43],in[11],in[51],in[19],in[59],in[27],
in[34],in[2],in[42],in[10],in[50],in[18],in[58],in[26],
in[33],in[1],in[41],in[9],in[49],in[17],in[57],in[25]}; endmodule
3.圈子秘钥的生成
modulekey_get(input[1:56]pre_key,
inputdes_mode,
input[3:0]inter_num,
outputwire[1:48]new_key,
outputreg[1:56]out_key);
regpre_key_0,pre_key_1;
reg[1:56]pre_key_var;
always@(*)
begin
if(des_mode==1'b0)
begin
case(inter_num)
4'd0,4'd1,4'd8,4'd15:
begin
pre_key_var=pre_key;
pre_key_0=pre_key_var[1];
pre_key_var[1:28]=pre_key_var[1:28]<<1;
pre_key_var[28]=pre_key_0;
pre_key_0=pre_key_var[29];
pre_key_var[29:56]=pre_key_var[29:56]<<1;
pre_key_var[56]=pre_key_0;
end4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd9,4'd10,4'd11, 4'd12,
4'd13,4'd14:
begin
pre_key_var=pre_key;
{pre_key_1,pre_key_0}=pre_key_var[1:2];
pre_key_var[1:28]=pre_key_var[1:28]<<2;
pre_key_var[27:28]={pre_key_1,pre_key_0};
{pre_key_1,pre_key_0}=pre_key_var[29:30];
pre_key_var[29:56]=pre_key_var[29:56]<<2;
pre_key_var[55:56]={pre_key_1,pre_key_0};
end
endcase
end
else
begin
case(inter_num)
4'd0:pre_key_var=pre_key;
4'd1,4'd8,4'd15:
begin
pre_key_var=pre_key;
pre_key_0=pre_key_var[28];
pre_key_var[1:28]=pre_key_var[1:28]>>1;
pre_key_var[1]=pre_key_0;
pre_key_0=pre_key_var[56];
pre_key_var[29:56]=pre_key_var[29:56]>>1;
pre_key_var[29]=pre_key_0;
end
default:
begin
pre_key_var=pre_key;
{pre_key_1,pre_key_0}=pre_key_var[27:28];
pre_key_var[1:28]=pre_key_var[1:28]>>2;
pre_key_var[1:2]={pre_key_1,pre_key_0};
{pre_key_1,pre_key_0}=pre_key_var[55:56];
pre_key_var[29:56]=pre_key_var[29:56]>>2;
pre_key_var[29:30]={pre_key_1,pre_key_0};
end
endcase
end
out_key=pre_key_var;
end
assignnew_key=
{pre_key_var[14],pre_key_var[17],pre_key_var[11],pre_key_var[24],pre_ke y_var[1],pre_key_var[5],
pre_key_var[3],pre_key_var[28],pre_key_var[15],pre_key_var[6],pre_key_v ar[21],pre_key_var[10],
pre_key_var[23],pre_key_var[19],pre_key_var[12],pre_key_var[4],pre_key_ var[26],pre_key_var[8],
pre_key_var[16],pre_key_var[7],pre_key_var[27],pre_key_var[20],pre_key_ var[13],pre_key_var[2],
pre_key_var[41],pre_key_var[52],pre_key_var[31],pre_key_var[37],pre_key _var[47],pre_key_var[55],
pre_key_var[30],pre_key_var[40],pre_key_var[51],pre_key_var[45],pre_key _var[33],pre_key_var[48],
pre_key_var[44],pre_key_var[49],pre_key_var[39],pre_key_var[56],pre_key _var[34],pre_key_var[53],
pre_key_var[46],pre_key_var[42],pre_key_var[50],pre_key_var[36],pre_key _var[29],pre_key_var[32]};
endmodule
3.f函数的实现
moduledes_f(inputclk,
inputreset,
inputdes_mode,
input[3:0]inter_num_i,
input[1:32]R_i,
input[1:32]L_i,
input[1:56]Key_i,
outputreg[1:32]R_o,
outputreg[1:32]L_o,
outputreg[1:56]Key_o);
reg[1:32]next_R;
//reg[31:0]R_i_var;
wire[1:48]expandedR;
reg[1:56]pre_key;
reg[1:48]new_key_tmp;
reg[3:0]inter_num;
wire[1:32]p;
reg[1:48]address_s;
reg[1:32]Soutput;
wire[1:32]Soutput_wire;
wire[1:48]new_key;
wire[1:56]out_key;
key_getkey_get(.pre_key(pre_key),.des_mode(des_mode),.inter_num(inter_num),. new_key(new_key),.out_key(out_key));
s1sbox1(.stage1_input(address_s[1:6]),.stage1_output(Soutput_wire[1:4]));
s2sbox2(.stage1_input(address_s[7:12]),.stage1_output(Soutput_wire[5:8]));
s3sbox3(.stage1_input(address_s[13:18]),.stage1_output(Soutput_wire[9:12]));
s4sbox4(.stage1_input(address_s[19:24]),.stage1_output(Soutput_wire[13:16])) ;
s5sbox5(.stage1_input(address_s[25:30]),.stage1_output(Soutput_wire[17:20])) ;
s6sbox6(.stage1_input(address_s[31:36]),.stage1_output(Soutput_wire[21:24])) ;
s7sbox7(.stage1_input(address_s[37:42]),.stage1_output(Soutput_wire[25:28])) ;
s8sbox8(.stage1_input(address_s[43:48]),.stage1_output(Soutput_wire[29:32])) ;
always@(posedgeclkornegedgereset)
begin
if(reset==1'b0)
begin
R_o<=32'd0;
L_o<=32'd0;
Key_o<=56'd0;
end
else
begin
Key_o<=out_key;
if(inter_num==4'b1111)
begin
R_o<=R_i;
L_o<=next_R;
end
else
begin
R_o<=next_R;
L_o<=R_i;end
end
end
assignexpandedR=
{R_i[32],R_i[1],R_i[2],R_i[3],R_i[4],R_i[5],
R_i[4],R_i[5],R_i[6],R_i[7],R_i[8],R_i[9],
R_i[8],R_i[9],R_i[10],R_i[11],R_i[12],R_i[13],
R_i[12],R_i[13],R_i[14],R_i[15],R_i[16],R_i[17],
R_i[16],R_i[17],R_i[18],R_i[19],R_i[20],R_i[21],
R_i[20],R_i[21],R_i[22],R_i[23],R_i[24],R_i[25],
R_i[24],R_i[25],R_i[26],R_i[27],R_i[28],R_i[29],
R_i[28],R_i[29],R_i[30],R_i[31],R_i[32],R_i[1]}; assignp={ Soutput[16],Soutput[7],Soutput[20],Soutput[21],
Soutput[29],Soutput[12],Soutput[28],Soutput[17],
Soutput[1],Soutput[15],Soutput[23],Soutput[26],
Soutput[5],Soutput[18],Soutput[31],Soutput[10],
Soutput[2],Soutput[8],Soutput[24],Soutput[14],
Soutput[32],Soutput[27],Soutput[3],Soutput[9],
Soutput[19],Soutput[13],Soutput[30],Soutput[6],
Soutput[22],Soutput[11],Soutput[4],Soutput[25]}; always@(*)
begin
pre_key=Key_i;
inter_num=inter_num_i;
new_key_tmp=new_key;
address_s=new_key_tmp^expandedR;
Soutput=Soutput_wire;
//
next_R=(L_i^p);
end
endmodule
5.迭代控制程序的设计与代码
modulecontrl(output[1:64]data_o_var_t,
outputreg[3:0]inter_num_curr,
outputreg[1:56]Key_i_var_out,
outputreg[1:32]R_i,L_i,
outputregready_o,
input[1:32]L_o,
input[1:32]R_o,
input[1:32]R_i_var,L_i_var,
input[1:56]Key_o,
input[1:28]C0,D0,
inputclk,reset,des_enable);
reg[3:0]inter_num_next;
assigndata_o_var_t=(ready_o==1'b1){L_o,R_o}:64'hzzzzzzzzzzzzzzzz; always@(posedgeclkornegedgereset)
if(reset==1'b0)
begin
inter_num_next<=4'd0;
inter_num_curr<=4'd0;
ready_o<=1'b0;
end
elseif(des_enable)
begin
if(ready_o==1'b0)
inter_num_curr<=inter_num_next;
end
always@(posedgeclkornegedgereset)
begin
if(reset==1'b0)ready_o<=1'b0;
elseif(inter_num_curr==4'd15)ready_o<=1'b1;
elseready_o<=1'b0;
end
always@(*)
begin
case(inter_num_curr)
4'd0:begin
//ready_o=1'b0;
R_i=R_i_var;
L_i=L_i_var;
Key_i_var_out={C0,D0};
inter_num_next=4'd1;
end
4'd1:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd2;
end
4'd2:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd3;
end
4'd3:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd4;
end
4'd4:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd5;
end
4'd5:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd6;
end
4'd6:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd7;
end
4'd7:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd8;
end
4'd8:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd9;
end
4'd9:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd10;
end
4'd10:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd11;
end
4'd11:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd12;
end
4'd12:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd13;
end
4'd13:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd14;
end
4'd14:begin
//ready_o=1'b0;
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
inter_num_next=4'd15;
end
4'd15:if(ready_o==1'b0)
begin
R_i=R_o;
L_i=L_o;
Key_i_var_out=Key_o;
//ready_o=1'b1;
end
endcase
end
endmodule
6.S盒的设计与实现(S1)
modules1(stage1_input,stage1_output);
input[5:0]stage1_input;
output[3:0]stage1_output;
reg[3:0]stage1_output;
//BIT5andBIT0is
//BIT4~1is
always@(stage1_input)
begin
case(stage1_input)//synopsysfull_caseparallel_case 0:stage1_output=4'd14;
1:stage1_output=4'd0;
2:stage1_output=4'd4;
3:stage1_output=4'd15;
4:stage1_output=4'd13;
5:stage1_output=4'd7;
6:stage1_output=4'd1;
7:stage1_output=4'd4;
8:stage1_output=4'd2;
9:stage1_output=4'd14;
10:stage1_output=4'd15;
11:stage1_output=4'd2;
12:stage1_output=4'd11;
13:stage1_output=4'd13;
14:stage1_output=4'd8;
15:stage1_output=4'd1;
16:stage1_output=4'd3;
17:stage1_output=4'd10;
18:stage1_output=4'd10;
19:stage1_output=4'd6;
20:stage1_output=4'd6;
21:stage1_output=4'd12;
22:stage1_output=4'd12;
60:stage1_output=4'd5;
61:stage1_output=4'd6;
62:stage1_output=4'd0;
63:stage1_output=4'd13;
endcase
end
endmodule
(三)、modelsim仿真
moduletestbench1;
regclk,reset,des_enable,des_mode;
reg[63:0]data_i,key_i;
wire[63:0]data_o;
wireready_o;
DESd1(clk,des_enable,
reset,
des_mode,
data_i,
key_i,
data_o,
ready_o);
initialclk=1'b0;
initial
begin
des_mode=1'b1;
#400reset=1'b0;des_enable=1'b0;
#7reset=1'b1;des_enable=1'b1;des_mode=1'b1;
data_i=64'h3b98d2eeaeb60035;
key_i
end
always#10clk=~clk;
endmodule
四、实验结果与分析
利用Modesim软件,建立工程,做出仿真结果。

五、实验体会
通过本次试验,我更加深刻理解了DES算法的原理与结构,并对其良好的加密性有了更深一步的理解。

通过编写VerilogHDL代码实现DES算法,让我对EDA设计中模块化的设计思想有了更进一步的了解。

同时,由于该算法有一定的难度,我也参照了网上的一些内容。

并学习Modelsim的仿真方法,完成了该实验。

这对我解决问题的能力有所提高。

相关文档
最新文档