DES算法的verilog实现

DES算法的verilog实现
DES算法的verilog实现

EDA试验报告

一、实验项目名称

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.整体结构框架搭建,实现总体功能

module DES(input clk,

input des_enable,

input reset,

input des_mode,

input [1:64] data_i,

input [1:64] key_i,

output wire [1:64] data_o,

output ready_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;

IP IP1(.in(data_i),

.L_i_var(L_i_var),

.R_i_var(R_i_var));

IP_ni IP_ni(.in(data_o_var_t),

.out(data_o));

pc_1 pc_1(.key_i(key_i),

.C0(C0),

.D0(D0));

//F(R,K)

des_f des_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));

//contral 16 F(R,K)

contrl contrl1(.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

module IP(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

module IP_ni(input [1:64] in,

output [1:64] out);

assign out =

{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.圈子秘钥的生成

module key_get(input [1:56] pre_key,

input des_mode,

input [3:0] inter_num,

output wire [1:48] new_key,

output reg [1:56] out_key);

reg pre_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;

end 4'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

assign new_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函数的实现

module des_f(input clk,

input reset,

input des_mode,

input [3:0] inter_num_i,

input [1:32] R_i,

input [1:32] L_i,

input [1:56] Key_i,

output reg [1:32] R_o,

output reg [1:32] L_o,

output reg [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_get(.pre_key(pre_key), .des_mode(des_mode), .inter_num(inter_num), .new_key (new_key), .out_key(out_key));

s1 sbox1(.stage1_input(address_s[1:6]), .stage1_output(Soutput_wire[1:4]));

s2

sbox2(.stage1_input(address_s[7:12]), .stage1_output(Soutput_wire[5:8]));

s3

sbox3(.stage1_input(address_s[13:18]), .stage1_output(Soutput_wire[9:12]));

s4

sbox4(.stage1_input(address_s[19:24]), .stage1_output(Soutput_wire[13:16]));

s5

sbox5(.stage1_input(address_s[25:30]), .stage1_output(Soutput_wire[17:20]));

s6

sbox6(.stage1_input(address_s[31:36]), .stage1_output(Soutput_wire[21:24]));

s7

sbox7(.stage1_input(address_s[37:42]), .stage1_output(Soutput_wire[25:28]));

s8

sbox8(.stage1_input(address_s[43:48]), .stage1_output(Soutput_wire[29:32]));

always @(posedge clk or negedge reset)

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

assign expandedR =

{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]};

assign p = { 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.迭代控制程序的设计与代码

module contrl(output [1:64] data_o_var_t,

output reg [3:0] inter_num_curr,

output reg [1:56] Key_i_var_out,

output reg [1:32] R_i, L_i,

output reg ready_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,

input clk, reset, des_enable);

reg [3:0] inter_num_next;

assign data_o_var_t = (ready_o == 1'b1)?{L_o,R_o}:64'hzzzzzzzzzzzzzzzz;

always @(posedge clk or negedge reset)

if(reset == 1'b0)

begin

inter_num_next <= 4'd0;

inter_num_curr <= 4'd0;

ready_o <= 1'b0;

end

else if(des_enable)

begin

if(ready_o == 1'b0)

inter_num_curr <= inter_num_next;

end

always @(posedge clk or negedge reset)

begin

if(reset == 1'b0) ready_o <= 1'b0;

else if(inter_num_curr == 4'd15) ready_o <= 1'b1;

else ready_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)

module s1(stage1_input,stage1_output);

input [5:0] stage1_input;

output [3:0] stage1_output;

reg [3:0] stage1_output;

//BIT5 and BIT0 is ?

//BIT4~1 is ?

always @( stage1_input)

begin

case(stage1_input) //synopsys full_case parallel_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仿真

module testbench1;

reg clk, reset, des_enable, des_mode; reg [63:0] data_i, key_i;

wire [63:0] data_o;

wire ready_o;

DES d1(clk, des_enable,

reset,

des_mode,

data_i,

key_i,

data_o,

ready_o);

initial clk = 1'b0;

initial

begin

des_mode = 1'b1;

#400 reset = 1'b0; des_enable = 1'b0;

#7 reset = 1'b1; des_enable = 1'b1; des_mode = 1'b1;

data_i =64'h3b98d2eeaeb60035;

key_i =64'h0123456789abcdef;

end

always #10 clk=~clk;

endmodule

四、实验结果与分析

利用Modesim软件,建立工程,做出仿真结果。

五、实验体会

通过本次试验,我更加深刻理解了DES算法的原理与结构,并对其良好的加密性有了更深一步的理解。通过编写VerilogHDL代码实现DES算法,让我对EDA设计中模块化的设计思想有了更进一步的了解。同时,由于该算法有一定的难度,我也参照了网上的一些内容。并学习Modelsim的仿真方法,完成了该实验。这对我解决问题的能力有所提高。

DES算法Java实现源代码

package des; /** * 加密过程: * 1.初始置换IP:将明文顺序打乱重新排列,置换输出为64位。 * 2.将置换输出的64位明文分成左右凉拌,左一半为L0,右一半称为R0,各32位。 * 3。计算函数的16轮迭代。 * a)第一轮加密迭代:左半边输入L0,右半边输入R0:由轮函数f实现子密钥K1对R0的加密, * 结果为32位数据组f(R0,K1), * b)第二轮加密迭代:左半边输入L1=R0,右半边输入R1=L0⊕f(R0,K1),由轮函数f实现子密钥 * K2对R1的加密,结果为32位数据组f(R1,K2),f(R1,K2)与L1模2相加,得到一个32为数据组L1⊕f(R1,K2). * c)第3到16轮迭代分别用密钥K3,K4……K16进行。4.再经过逆初始置换IP-1,将数据打乱重排,生成64位密文。 * * 子密钥生成过程: * 1.将64位的密钥经过PC-1置换生成56位密钥。 * 2.将56位的密钥分成左右两部分,分别进行移位操作(一共进行16轮),产生16个56位长度的子密钥。 * 3.将16个56位的子密钥分别进行PC-2置换生成16个48位的子密钥。 * * 轮函数f的工作过程: * 1.在第i次加密迭代过程中,扩展置换E对32位的Ri-1的各位通过置换表置换为48位的输出。 * 2.将该48位的输出与子密钥Ki进行异或操作,运算结果经过S盒代换运算,得到一个32位比特的输出。 * 3。该32位比特输出再经过P置换表进行P运算,将其各位打乱重排,生成32位的输出。 * * author Ouyang * */ public class Des { int[] byteKey; public Des(int[] byteKey) { this.byteKey = byteKey; } private static final int[] IP = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48,

DES算法实验报告

DES算法实验报告 姓名:学号:班级: 一、实验环境 1.硬件配置:处理器(英特尔Pentium双核E5400 @ 2.70GHZ 内存:2G) 2.使用软件: ⑴操作系统:Windows XP 专业版32位SP3(DirectX 9.0C) ⑵软件工具:Microsoft Visual C++ 6.0 二、实验涉及的相关概念或基本原理 1、加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。 三、实验内容 1、关键代码 ⑴子密钥产生

⑵F函数以及加密16轮迭代 2、DES加密算法的描述及流程图 ⑴子密钥产生 在DES算法中,每一轮迭代都要使用一个子密钥,子密钥是从用户输入的初始密钥产生的。K是长度为64位的比特串,其中56位是密钥,8位是奇偶校验位,分布在8,16,24,32,40,48,56,64比特位上,可在8位中检查单个错误。在密钥编排计算中只用56位,不包括这8位。子密钥生成大致分为:置换选择1(PC-1)、循环左移、置换选择2(PC-2)等变换,分别产生16个子密钥。 DES解密算法与加密算法是相同的,只是子密钥的使用次序相反。 ⑵DES加密算法 DES密码算法采用Feistel密码的S-P网络结构,其特点是:加密和解密使用同一算法、

AES密码学课程设计(C语言实现)

成都信息工程学院课程设计报告 AES加密解密软件的实现 课程名称:应用密码算法程序设计 学生姓名:樊培 学生学号:2010121058 专业班级:信息对抗技术101 任课教师:陈俊 2012 年6月7日

课程设计成绩评价表

目录 1、选题背景 (4) 2、设计的目标 (4) 2.1基本目标: (4) 2.2较高目标: (5) 3、功能需求分析 (5) 4、模块划分 (6) 4.1、密钥调度 (6) 4.2、加密 (8) 4.2.1、字节代替(SubBytes) (8) 4.2.2、行移位(ShiftRows) (10) 4.2.3、列混合(MixColumn) (11) 4.2.4、轮密钥加(AddRoundKey) (13) 4.2.5、加密主函数 (14) 4.3、解密 (16) 4.3.1、逆字节替代(InvSubBytes) (16) 4.3.2、逆行移位(InvShiftRows) (17) 4.3.3、逆列混合(InvMixCloumns) (17) 4.3.4、轮密钥加(AddRoundKey) (18) 4.3.5、解密主函数 (18) 5.测试报告 (20) 5.1主界面 (20) 5.2测试键盘输入明文和密钥加密 (20) 5.3测试键盘输入密文和密钥加密 (21) 5.3测试文件输入明文和密钥加密 (22) 5.4测试文件输入密文和密钥加密 (22) 5.5软件说明 (23) 6.课程设计报告总结 (23) 7.参考文献 (24)

1、选题背景 高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael 之命名之,投稿高级加密标准的甄选流程。(Rijndael的发音近于 "Rhine doll") 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支援更大范围的区块和密钥长度:AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;而Rijndael使用的密钥和区块长度可以是32位元的整数倍,以128位元为下限,256位元为上限。加密过程中使用的密钥是由Rijndael 密钥生成方案产生。大多数AES计算是在一个特别的有限域完成的。 截至2006年,针对AES唯一的成功攻击是旁道攻击 旁道攻击不攻击密码本身,而是攻击那些实作于不安全系统(会在不经意间泄漏资讯)上的加密系统。2005年4月,D.J. Bernstein公布了一种缓存时序攻击法,他以此破解了一个装载OpenSSL AES加密系统的客户服务器[6]。为了设计使该服务器公布所有的时序资讯,攻击算法使用了2亿多条筛选过的明码。有人认为[谁?],对于需要多个跳跃的国际互联网而言,这样的攻击方法并不实用[7]。 Bruce Schneier称此攻击为“好的时序攻击法”[8]。2005年10月,Eran Tromer和另外两个研究员发表了一篇论文,展示了数种针对AES的缓存时序攻击法。其中一种攻击法只需要800个写入动作,费时65毫秒,就能得到一把完整的AES密钥。但攻击者必须在执行加密的系统上拥有执行程式的权限,方能以此法破解该密码系统。 虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。 2、设计的目标 2.1基本目标: (1)在深入理解AES加密/解密算法理论的基础上,能够设计一个AES加密/解密软件系统,采用控制台模式,使用VS2010进行开发,所用语言为C语言进行编程,实现加密解密; (2)能够完成只有一个明文分组的加解密,明文和密钥是ASCII码,长度都为16个字符(也就是固定明文和密钥为128比特),输入明文和密钥,输出密文,进行加密后,能够进

DES算法及其程序实现

DES算法及其程序实现 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: 二.D ES算法的编程实现 #include #include using namespace std;

const static char ip[] = { //IP置换 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char fp[] = { //最终置换 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char sbox[8][64] = { //s_box /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, /* S2 */ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, /* S3 */ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, /* S4 */ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,

DES算法源代码

#include #include void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制

des课程设计

DES加解密算法的实现 一、DES算法的概述 DES(Data Encryption Standard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES 加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC 校验等,均用到DES算法。 DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16 轮的替换和移位后,输出完全不同的64比特密文数据。由于DES 算法仅使用最大为64比特的标准算法和逻辑运算,运算速度快,密

钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。 二、DES算法描述 DES算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为64比特的块。图2-1是DES加密算法的加密流程。图2-2是密钥扩展处理过程。

DES加密解密课程设计报告

D E S加密解密课程设计报 告 Prepared on 22 November 2020

成都信息工程学院课程设计报告 DES算法加密与解密的设计与实现课程名称:密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: XX年 XX 月 XX 日

目录

1背景 DES算法概述 DES(Data Encryption Standard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN 码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16轮的替换和移位后,输出完全不同的64比特密文数据。由于DES算法仅使用最大为64比特的标准算法和逻辑运算,运算速

DES算法源代码

void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制 char init[9]={"HTmadeit"}; //设置初始化向量为“HTmadeit” int CBC[64]; int result[13][64];

DES算法实现过程分析

DES算法实现过程分析 来源:中国论文下载中心 [ 03-03-18 14:30:00 ] 作者:本站会员编辑:丢oO丢oO 1. 处理密钥: 1.1 从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个”1”位.(本文如未特指,均指二进制位) 1.2 具体过程: 1.2.1 对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表所示: 表一为忽略校验位以后情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 1.2.2 把变换后的密钥等分成两部分,前28位记为C[0], 后28位记为D[0]. 1.2.3 计算子密钥(共16个),从i=1开始。 1.2.3.1 分别对C[i-1],D[i-1]作循环左移来生成C[i],D[i].(共16次)。每次循环左移位数 如下表所示: 循环次数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 左移位数1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 1.2.3.2 串联C[i],D[i],得到一个56位数,然后对此数作如下变换以产生48位子密钥K[i]。变换过程如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 1.2.3.3 按以上方法计算出16个子密钥。 2.对64位数据块的处理: 2.1 把数据分成64位的数据块,不够64位的以适当的方式填补。 2.2对数据块作变换。 bit goes to bit bit goes to bit 58 1 57 33 50 2 49 34

DES算法代码及实验报告

实验名称DES算法实验报告实验(实习)日期________得分 ______ 指导教师沈剑 计算机系专业软件工程年级 11 班次3 __________姓名张渊学号 931 1、实验目的 理解对称加解密算法的原理和特点 理解DES算法的加解密原理 2、D ES算法详述 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32 位,其置换规则见下表: 58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7, 即将输入的第58位换到第一位,第50位换到第2位,……,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位, 例:设置换前的输入值为D1D2D3? D64,则经过初始置换后的结果为:L0=D550 (8) R0=D57D49 (7) 经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置 换,又将第40位换回到第1位,其逆置换规则如下表所示: 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25, 放大换位表 32,1,2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10,11, 12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21, 22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1, 单纯换位表 16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,

DES算法的简介及编程实现

实验一DES算法 实验目的: 1.深入了解DES算法的原理、特点、密钥及输入输出 2.通过编程来模拟DES算法的加密及解密过程 实验内容: 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:

二.D ES算法的编程实现 #include #include using namespace std; const static char ip[] = { //IP置换 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char fp[] = { //最终置换 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char sbox[8][64] = { //s_box /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, /* S2 */ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, /* S3 */ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, /* S4 */

DES算法实现 课程设计

通达学院课程设计Ⅱ报告( 2016/ 2017学年第 1 学期) 题目: DES算法实现 专业计算机科学与技术(信息安全) 学生姓名 班级学号 指导教师王波 指导单位计算机学院信息安全系 日期

DES算法的实现 一、课题内容和要求 对称加密就是加密和解密所用的密钥是一样的,加密的强度很大程度上在于密钥的强度以及加密算法的保密,最常见的对称加密算法有DES、IDEA、RC4、RC5等。本设计题要求实现DES加密和解密算法,能对文件实现加解密。 二、对设计要求的理解 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits,然后使用标准DES的算法依次对读取的64bits明密文进出加解密处理。文件的路径的输入有比较严格的格式约束。如:盘符名:\\文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。 三、概要设计 这个程序主要是 DES算法部分的加密和解密,还有后面对文件的操作。 程序主要流程图如下: 图-1 程序流程图

这个程序的关键在DES算法的操作,主要有下的主要步骤: 1.初始置换 IP; 2.子密钥 Ki 的获取; 3.密码函数 f ; 4.尾置换 IP-1 ; 下面是具体的几个过程: 1)初始置换IP 这一部分很简单,IP(initial permutation)是一个 8x8 的置换表: int IP[] = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; 根据表中的规定,将输入的 64 位明文重新进行排序,即将第 58 位放到第 1 位,第 50 位放到第 2 位……以此类推。初始置换以后得到的是一个 64 位的输出。 2)子密钥 Ki 的获取 用户输出的密钥是 64 位的,根据密钥置换表PC-1,将 64 位变成 56 位密钥。(去掉了奇偶校验位)将 PC-1 置换得到的 56 位密钥,分为前28位 C0 和后28位 D0,分别对它们进行循环左移,C0左移得到 C1,D0 左移得到 D1。将 C1 和 D1 合并成 56 位,然后通过PC-2表进行压缩置换,得到当前这一轮的 48 位子密钥 K1 。然后对 C1 和 D1 进行左移和压缩置换,获取下一轮的子密钥……一共进行16轮,得到 16 个 48 位的子密钥。 3)密码函数 f ●密码函数f(R, K)接受两个输入:32 位的数据和 48 位的子密钥。然后: ●通过表 E 进行扩展置换,将输入的 32 位数据扩展为 48 位; ●将扩展后的 48 位数据与 48 位的子密钥进行异或运算; ●将异或得到的 48 位数据分成 8 个 6 位的块,每一个块通过对应的一个 S 表产 生一个 4 位的输出。 其中,每个 S 表都是 4 行 16 列。具体的置换过程如下:把 6 位输入中的第 1 位和第 6 位取出来行成一个两位的二进制数 x ,作为 Si 表中的行数(0~3);把 6 位

DES加密算法文档

北京工业大学 网络与信息安全概论 学院: 专业: 指导老师: 姓名: 学号:

目录 目录 (2) 一、DES算法的基本原理 (3) 1.1背景介绍 (3) 1.2加密原理 (3) 二、DES算法的详细步骤 (4) 2.1加密详细步骤 (4) 2.2压缩置换到56位 (5) 2.3 C0和D0的分类 (6) 2.4循环左移 (6) 2.5压缩置换 (7) 三、DES算法的实现 (7) 3.1详细设计 (8) 3.1.2加密/解密文件的预览 (8) 3.2文件的加密/解密 (9) 3.3系统测试 (11) 3.4总结 (14)

一、DES算法的基本原理 1.1背景介绍 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES-Data Encryption Standard)。 DES (Data Encryption Standard),是IBM在上个世纪70年代开发的单密钥对称加解密算法。该算法利用一个56+8奇偶校验位(第8, 16, 24, 32, 40, 48, 56, 64位)=64位的密钥对以64位为单位的块数据进行加解密。 1.2加密原理 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。 在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

网络安全课程设计模板 -DES算法

网络安全课程设计 课题名称DES算法程序实现 院系电子与信息工程学院计算机系 班级网络工程 学号 姓名 指导老师 起止周次2017-2018学年第二学期第10-18周 一、课题设计目标 提高学生在网络安全方面综合运用理论知识解决实际问题的能力。使学生得到一次科学研究工作的初步训练,懂得网络加密/解密的方法和实现、网络相关安全工具的使用方法与网络攻击的防范 二、课题设计任务 a、对称密码算法的理论学习 b、利用VC/C/C++/Java(任意一种)实现DES算法,要求,有界面,输入明文,点击加密,可实现加密,把明文转变为密文;点击解密,可实现解密,即把密文转变为明文。 三、课题设计硬件环境 带有Windows操作系统的计算机。 四、课题设计软件环境 VS2010编译环境 五、设计步骤及代码 1.算法描述 DES算法的流程如图1-1和1-2所示。首先把明文分成若干个64bit的分组,算法一个分组作为输入,通过一个初始置换(IP)将明文分组分成左半部分(L0)和右半部分(R0)各位32比特。然后进行16轮完全相同的运算,这些运算称为函数f,在运算过程中数据与密钥相结合。经过16轮运算后,左、右两部分合在一起经过一个末置换(初始转换的逆置

换IP-1),输出一个64bit的密文分组。 2.程序源代码 #include #include using namespace std; const static char ip[] = { //IP置换

58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char fp[] = { //最终置换 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char sbox[8][64] = { //s_box /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, /* S2 */ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, /* S3 */ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, /* S4 */ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,

DES加密算法的实现(详细版)

v 3DES加密算法的实现毕业论文 一、DES加密及解密算法程序源代码: #include using namespace std; const static char IP_Table[] = { //IP_Table置换58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char Final_Table[] = { //最终置换40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char S_Box[8][64] = { //s_box /* S1 */ {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, /* S2 */ {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, /* S3 */ {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,

相关文档
最新文档