DES加密解密算法C++实现实验报告des算法实验.docx
《DES加密解密算法C++实现实验报告des算法实验.docx》由会员分享,可在线阅读,更多相关《DES加密解密算法C++实现实验报告des算法实验.docx(12页珍藏版)》请在冰豆网上搜索。
![DES加密解密算法C++实现实验报告des算法实验.docx](https://file1.bdocx.com/fileroot1/2023-1/3/ba2bf2d9-22d6-4ba3-901b-9105baa145f2/ba2bf2d9-22d6-4ba3-901b-9105baa145f21.gif)
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