DES加密解密算法C++实现实验报告des算法实验.docx

上传人:b****5 文档编号:6142476 上传时间:2023-01-04 格式:DOCX 页数:12 大小:19.30KB
下载 相关 举报
DES加密解密算法C++实现实验报告des算法实验.docx_第1页
第1页 / 共12页
DES加密解密算法C++实现实验报告des算法实验.docx_第2页
第2页 / 共12页
DES加密解密算法C++实现实验报告des算法实验.docx_第3页
第3页 / 共12页
DES加密解密算法C++实现实验报告des算法实验.docx_第4页
第4页 / 共12页
DES加密解密算法C++实现实验报告des算法实验.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

DES加密解密算法C++实现实验报告des算法实验.docx

《DES加密解密算法C++实现实验报告des算法实验.docx》由会员分享,可在线阅读,更多相关《DES加密解密算法C++实现实验报告des算法实验.docx(12页珍藏版)》请在冰豆网上搜索。

DES加密解密算法C++实现实验报告des算法实验.docx

DES加密解密算法C++实现实验报告des算法实验

DES_加密解密算法C++实现--实验报告des算法实验

..

...

1?

实验一?

1、实验题目?

利用C/C++编程实现DES加密算法或MD5加密算法。

我选择的是用C++语言实现

DES的加密算法?

2、实验目的?

通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其实际应用?

价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算法的实现过程?

3、实验环境?

操作系统:

WIN7旗舰版?

开发工具:

Visual?

Studio?

2010旗舰版?

开发语言:

C++?

4、实验原理?

DES加密流程

2?

?

如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1,压缩换位2,扩

展置换,S盒置换,异或运算、终结置换等过程。

?

初始置换是按照初始置换表将64位明文重新排列次序?

扩展置换是将原32为数据扩展为48位数据,它主要由三个目的:

1、产生与子密钥相同的长度2、提供更长的结果,使其在加密过程中可以被压缩

3、产生雪崩效应,使得输入的一位将影响两个替换?

S盒置换是DES算法中最核心的容,在DES中,只有S盒置换是非线性的,它比DES中其他任何一步都提供更好的安全性?

终结置换与初始置换相对应,它们都不影响DES的安全性,主要目的是为了更容易将明文与密文数据一字节大小放入DES的f算法中?

DES解密流程与加密流程基本相同,只不过在进行16轮迭代元算时,将子密钥生成的K的次序倒过来进行迭代运算?

5、实验过程记录?

在对DES算法有了清晰的认识后,编码过程中我将其分为几个关键部分分别进行编码,最后将整个过程按顺序执行,即可完成DES的加密,代码的主要几个函数如下:

?

//Byte转为Bit?

ByteToBit(ElemType?

ch,ElemType?

bit)//Bit转为Byte?

BitToByte(ElemType?

bit,ElemType?

ch)//初始置换?

InitialEX(ElemType?

Inorder,ElemType?

Disorder)?

//终结置换?

AntiEx(ElemType?

Disorder)?

//扩展置换?

ExpandEX(ElemType?

RightMsg,ElemType?

ExpandMsg)?

//16轮迭代加密?

MoveLeft(ElemType?

C,ElemType?

D,ElemType?

L0,ElemType?

R0)

3?

//16轮迭代解密?

mMoveLeft(ElemType?

C,ElemType?

D,ElemType?

L0,ElemType?

R0)?

//生成48位子密钥?

GetCD48(ElemType?

C,ElemType?

D,ElemType?

Secret)?

//48位明文与子密钥进行异或运算?

XOR(ElemType?

ExpandMsg,ElemType?

Secret,ElemType?

Result)?

//S盒四位输出?

getSOut(ElemType?

Result,ElemType?

Sout)?

//直接置换?

DirExchange(ElemType?

Sout,ElemType?

DirOut)?

//Li与Ri进行抑或运算?

XORLR(ElemType?

DirOut,ElemType?

Left,ElemType?

Result)

函数执行次序和调用关系关系如下:

?

6.源代码

//?

DES.cpp?

:

?

定义控制台应用程序的入口点。

?

//

#include?

“stdafx.h"?

#include?

"function.h"?

#include?

iostream?

#includebitset?

#includestring?

using?

namespace?

std;

//置换矩阵?

int?

IP_EX=?

{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?

};?

?

int?

IP_ANTEX=?

{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,?

41,?

10,?

50,?

18,?

58,?

26,33,1,?

41,9,?

49,?

17,?

57,?

25?

};

//扩展矩阵

?

int?

EXTEND=?

{?

?

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,1,?

2?

};

//S盒?

int?

S=?

{{{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}?

?

},{{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}?

?

},{{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}?

?

},{{?

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}},{{2,?

12,4,1,7,?

10,?

11,6,8,5,3,?

15,?

13,0,?

14,9},{14,?

11,2,?

12,4,7,?

13,1,5,0,?

15,?

10,3,9,8,6},{4,2,1,?

11,?

10,?

13,7,8,?

15,9,?

12,5,6,3,0,?

14},{11,8,?

12,7,1,?

14,2,?

13,6,?

15,0,9,?

10,4,5,3}},

{?

{12,1,?

10,?

15,9,2,6,8,0,?

13,3,4,?

14,7,5,?

11},{10,?

15,4,2,7,?

12,9,5,6,1,?

13,?

14,0,?

11,3,8},{9,?

14,?

15,5,2,8,?

12,3,7,0,4,?

10,1,?

13,?

11,6},{4,3,2,?

12,9,5,?

15,?

10,?

11,?

14,1,7,6,0,8,?

13}?

?

},{{4,?

11,2,?

14,?

15,0,8,?

13,3,?

12,9,7,5,?

10,6,1},{13,0,?

11,7,4,9,1,?

10,?

14,3,5,?

12,2,?

15,8,6},{1,4,?

11,?

13,?

12,3,7,?

14,?

10,?

15,6,8,0,5,9,2},{6,?

11,?

13,8,1,4,?

10,7,9,5,0,?

15,?

14,2,3,?

12}?

?

},{{13,2,8,4,6,?

15,?

11,1,?

10,9,3,?

14,5,0,?

12,7},{1,?

15,?

13,8,?

10,3,7,4,?

12,5,6,?

11,0,?

14,9,2},{7,?

11,4,1,9,?

12,?

14,2,0,6,?

10,?

13,?

15,3,5,8},{2,1,?

14,7,4,?

10,8,?

13,?

15,?

12,9,0,3,5,6,?

11}?

?

}?

};

?

int?

DIREX=?

{16,7,?

20,?

21,29,?

12,?

28,?

17,1,?

15,?

23,?

26,5,?

18,?

31,?

10,2,8,?

24,?

14,32,?

27,3,9,19,?

13,?

30,6,22,?

11,4,?

25?

};

//左移移位表?

int?

__T=?

{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1?

};

//压缩换位表2

?

int?

CutEX=?

{14,?

17,?

11,?

24,1,5,

?

3,?

28,?

15,6,?

21,?

10,23,?

19,?

12,4,?

26,8,16,7,?

27,?

20,?

13,2,41,?

52,?

31,?

37,?

47,?

55,30,?

40,?

51,?

45,?

33,?

48,44,?

49,?

39,?

56,?

34,?

53,46,?

42,?

50,?

36,?

29,?

32?

};

typedef?

char?

ElemType;

ElemType?

subsec;

//Byte转bit?

int?

ByteToBit(ElemType?

ch,ElemType?

bit)?

{?

?

for(int?

index?

=?

7;index?

inde__){bit[index]?

=?

(chindex)?

//cout(int)bit[index];}?

?

return?

0;?

}

//bit转Byte?

int?

BitToByte(ElemType?

bit,ElemType?

ch)?

{ElemType?

tempch=0;ElemType?

tempbit;for(int?

i=0;ii++){tempbit[i]=bit[i];?

?

}?

?

tempbit=0;?

?

for(int?

index?

=?

7;index?

inde__)

{?

tempch=tempch|(tempbit[index](index));}ch=tempch;?

?

//cout(char)tempchendl;

return?

0;

}?

//按64位分一组?

void?

Get64Bit(ElemType?

ch,ElemType?

bit)?

{ElemType?

temp;int?

count=0;for(int?

i=0;ii++){ByteToBit(ch[i],temp);for(int?

j=0;jj++){?

bit[count*8+j]=temp[7-j];?

}?

count++;?

}?

}

//初始置换?

void?

InitialEX(ElemType?

Inorder,ElemType?

Disorder)?

{for(int?

i=0;ii++){Disorder[i]=Inorder[IP_EX[i]-1];}?

}

//逆置换?

void?

AntiEx(ElemType?

Disorder)?

{ElemType?

temp;for(int?

i=0;ii++){

temp[i]=Disorder[i];?

?

}?

?

for(int?

i=0;ii++){Disorder[i]=temp[IP_ANTEX[i]-1];?

?

}?

}

//扩展置换?

void?

ExpandEX(ElemType?

RightMsg,ElemType?

ExpandMsg)?

{?

?

for(int?

i=0;ii++){ExpandMsg[i]=RightMsg[EXTEND[i]-1];?

?

}?

}?

//16轮加密迭代?

void?

MoveLeft(ElemType?

C,ElemType?

D,ElemType?

L0,ElemType?

R0)?

{ElemType?

Secret;//子密钥ElemType?

Result;//每轮异或结果ElemType?

Sout;

//每轮S盒输出ElemType?

DirOut;//直接置换输出?

?

ElemType?

RResult;ElemType?

LResult;ElemType?

ExpandMsg;ElemType?

temp;for(int?

i=0;ii++){LResult[i]=L0[i];

RResult[i]=R0[i];?

?

}?

?

for(int?

i=0;ii++){if(__T[i]==1){?

for(int?

j=0;jj++)?

{C[i]=C[i+1];?

}?

C=0;?

}else{?

for(int?

j=0;jj++)?

{

C[i]=C[i+2];?

}?

C=0;?

C=0;?

}?

ExpandEX(RResult,ExpandMsg);GetCD48(C,D,Secret);

for(int?

j=0;jj++)?

{?

subsec[15-i][j]=Secret[j];//获取界面的子密钥?

}?

XOR(ExpandMsg,Secret,Result);//S盒置换?

getSOut(Result,Sout);//直接置换?

DirExchange(Sout,DirOut);//与L进行异或?

XORLR(DirOut,LResult,temp);for(int?

i=0;ii++){?

LResult[i]=RResult[i];?

}?

for(int?

i=0;ii++){?

RResult[i]=temp[i];}?

for(int?

i=0;ii++){?

L0[i]=LResult[i];?

R0[i]=RResult[i];?

}?

}?

?

/*cout"zuo"endl;for(int?

i=0;ii++){cout(int)LResult[i];if((i+1)%8==0){?

coutendl;?

}?

?

}?

cout"右边"endl;for(int?

i=0;ii++){cout(int)RResult[i];if((i+1)%8==0)

{?

coutendl;?

}

}*/?

LResult[j]=RResult[j];?

}?

for(int?

j=0;jj++){?

RResult[j]=temp[j];

}?

}?

?

for(int?

i=0;ii++){L0[i]=LResult[i];

R0[i]=RResult[i];?

?

}?

?

/*cout"左边"endl;for(int?

i=0;ii++){cout(int)LResult[i];if((i+1)%8==0){?

coutendl;?

}?

?

}?

cout"右边"endl;for(int?

i=0;ii++){cout(int)RResult[i];if((i+1)%8==0){

?

coutendl;}}*/?

}

//生成48位子密钥?

void?

GetCD48(ElemType?

C,ElemType?

D,ElemType?

Secret)?

{ElemType?

temp;for(int?

i=0;ii++){?

temp[i]=C[i];}?

for(int?

i=28;ii++)?

?

{?

temp[i]=C[i];}?

?

for(int?

i=0;ii++){Secret[i]=temp[CutEX[i]];?

?

}?

}

//48位明文与子密钥进行异或?

/*ExpandMsg?

48位明文,Secret?

48位密钥,Result?

异或结果*/?

void?

XOR(ElemType?

ExpandMsg,ElemType?

Secret,ElemType?

Result)?

{for(int?

i=0;ii++){Result[i]=ExpandMsg[i]^Secret[i];?

?

}?

}

//S盒四位输出?

void?

getSOut(ElemType?

Result,ElemType?

Sout)?

{int?

row;int?

col;?

?

ElemType?

temp;for(int?

i=0;ii++){for(int?

j=0;jj++){?

temp[j]=Result[i*6+j];}?

row=temp*2+temp;?

col=temp*8+temp*4+temp*2+temp*1;int?

k=S[i][row][col]%2;Sout[i*4+3]=k;Sout[i*4+2]=k%2;Sout[i*4+1]=(k%2)%2;Sout[i*4]=((k%2)%2)%2;?

?

}?

}

//直接置换?

void?

DirExchange(ElemType?

Sout,ElemType?

DirOut)?

{?

?

for(int?

i=0;ii++){DirOut[i]=Sout[DIREX[i]-1];?

?

}?

}?

//左右异或得到R[i]?

void?

XORLR(ElemType?

DirOut,ElemType?

Left,ElemType?

Result)?

{for(int?

i=0;ii++){Result[i]=DirOut[i]^Left[i];?

?

}?

}?

void?

_tmain(int?

argc,?

_TCHAR*?

argv[])?

{ElemType?

bit;ElemType?

ch;ElemType?

Disorder;ElemType?

right;ElemType?

left;ElemType?

expand;ElemType?

SECRET={1,1,0,1,0,0,1,1,1,0,1,0,1,1,0,0,0,0,1,0,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,1,0,1?

?

};?

?

//获取C0与D0ElemType?

C;ElemType?

D;for(int?

i=0;ii++){C[i]=SECRET[i];

D[i]=SECRET[i+28];?

?

}?

?

cout"请输入原文:

"endl;

string?

str;

?

cinstr;?

?

DivideString(str,1,ch);Get64Bit(ch,bit);?

?

cout"原64位明文"endl;for(int?

i=0;ii++){cout(int)bit[i];if((i+1)%8==0){?

coutendl;?

}?

?

}?

?

coutendl;?

?

cout"置换后的乱序64位明文"endl;InitialEX(bit,Disorder);for(int?

i=0;ii++){cout(int)Disorder[i];if((i+1)%8==0){

coutendl;}}?

?

coutendl;?

?

cout"获取右半边明文"endl;for(int?

i=32;ii++){right[i-32]=Disorder[i];cout(int)right[i-32];if((i+1)%8==0){?

coutendl;?

}?

?

}?

?

coutendl;?

?

cout"获取左半边明文"endl;for(int?

i=0;ii++){left[i]=Disorder[i];cout(int)left[i];if((i+1)%8==0){?

coutendl;?

}?

?

}?

?

coutendl;?

?

ExpandEX(right,expand);?

?

cout"输出第一次扩展明文"endl;for(int?

i=0;ii++){cout(int)expand[i];if((i+1)%8==0){?

coutendl;?

}?

?

}?

?

coutendl;?

?

cout"输出c"endl;for(int?

i=0;ii++){cout(int)C[i];if((i+1)%7==0){?

coutendl;

}?

?

}?

?

coutendl;?

?

cout"输出d"endl;for(int?

i=0;ii++){cout(int)D[i];if((i+1)%7==0){?

coutendl;}?

?

}?

?

coutendl;?

?

MoveLeft(C,D,left,right);ElemType?

SecretOut;for(int?

i=0;ii++){SecretOut[i]=right[i];

SecretOut[i+32]=left[i];?

?

}?

?

AntiEx(SecretOut);?

?

cout"密文二进制输出"endl;for(int?

i=0;ii++)

{?

cout(int)SecretOut[i];if((i+1)%8==0){?

coutendl;

}?

?

}?

?

coutendl;?

?

ElemType?

chout;?

?

cout"密文输出"endl;Bit64ToByte8(SecretOut,chout);for(int?

i=0;ii++){cout(char)chout[i];?

?

}?

?

coutendl;?

int?

solve;?

?

coutendl"输入1开始解密"endl;cinsolve;if(solve==1){cout"开始解密"endl;ElemType?

mDisorder;ElemType?

mleft;ElemType?

mright;?

ElemType?

mexpand;?

InitialEX(SecretOut,mDisorder);?

cout"获取右半边密文"endl;for(int?

i=32;ii++){?

mright[i-32]=mDisorder[i];?

cout(int)mright[i-32];?

if((i+1)%8==0)?

{coutendl;?

}?

}?

coutendl;?

cout"获取左半边密文"endl;for(int?

i=0;ii++){?

mleft[i]=mDisorder[i];?

cout(int)mleft[i];

if((i+1)%8==0)?

{?

?

coutendl;?

}}?

coutendl;?

ExpandEX(mright,mexpand);?

cout"输出第一次扩展明文"en

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1