DES加密解密算法C++实现实验报告des算法实验Word文档下载推荐.docx
- 文档编号:19143223
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:12
- 大小:19.30KB
DES加密解密算法C++实现实验报告des算法实验Word文档下载推荐.docx
《DES加密解密算法C++实现实验报告des算法实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DES加密解密算法C++实现实验报告des算法实验Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
L0,ElemType?
R0)
3?
//16轮迭代解密?
mMoveLeft(ElemType?
R0)?
//生成48位子密钥?
GetCD48(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"
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,?
16,?
64,?
32,39,7,?
15,?
63,?
31,38,6,?
14,?
62,?
30,37,5,?
13,?
61,?
29,36,4,?
12,?
60,?
28,35,3,?
11,?
59,?
27,34,2,?
10,?
58,?
26,33,1,?
41,9,?
17,?
57,?
25?
//扩展矩阵
EXTEND=?
{?
32,1,2,3,4,5,4,5,6,7,8,9,8,9,?
13,12,?
17,16,?
21,20,?
25,24,?
29,28,?
31,1,?
2?
//S盒?
S=?
{{{14,4,?
13,1,2,?
11,8,3,?
10,6,?
12,5,9,0,7},{0,?
15,7,4,?
14,2,?
13,1,?
11,9,5,3,8},{4,1,?
14,8,?
13,6,2,?
12,9,7,3,?
10,5,0},{15,?
12,8,2,4,9,1,7,5,?
11,3,?
10,0,6,?
13}?
},{{15,1,8,?
14,6,?
11,3,4,9,7,2,?
12,0,5,?
10},{3,?
13,4,7,?
15,2,8,?
12,0,1,?
10,6,9,?
11,5?
},{0,?
14,7,?
10,4,?
13,1,5,8,?
12,6,9,3,2,?
15?
},{13,8,?
10,1,3,?
15,4,2,?
11,6,7,?
14,9}?
},{{10,0,9,?
14,6,3,?
15,5,1,?
12,7,?
11,4,2,8},{13,7,0,9,3,4,6,?
10,2,8,5,?
15,1},{13,6,4,9,8,?
15,3,0,?
11,1,2,?
12,5,?
14,7},{1,?
13,0,6,9,8,7,4,?
14,3,?
11,5,2,?
12}?
},{{?
7,?
14,3,0,6,9,?
10,1,2,8,5,?
12,4,?
15},{13,8,?
11,5,6,?
15,0,3,4,7,2,?
12,1,?
14,9},{10,6,9,0,?
11,7,?
15,1,3,?
14,5,2,8,4},{3,?
15,0,6,?
10,1,?
13,8,9,4,5,?
12,7,2,?
14}},{{2,?
12,4,1,7,?
11,6,8,5,3,?
13,0,?
14,9},{14,?
11,2,?
12,4,7,?
13,1,5,0,?
10,3,9,8,6},{4,2,1,?
13,7,8,?
15,9,?
12,5,6,3,0,?
14},{11,8,?
12,7,1,?
13,6,?
15,0,9,?
10,4,5,3}},
{?
{12,1,?
15,9,2,6,8,0,?
13,3,4,?
14,7,5,?
11},{10,?
15,4,2,7,?
12,9,5,6,1,?
14,0,?
11,3,8},{9,?
15,5,2,8,?
12,3,7,0,4,?
11,6},{4,3,2,?
12,9,5,?
14,1,7,6,0,8,?
},{{4,?
15,0,8,?
13,3,?
12,9,7,5,?
10,6,1},{13,0,?
11,7,4,9,1,?
14,3,5,?
12,2,?
15,8,6},{1,4,?
12,3,7,?
15,6,8,0,5,9,2},{6,?
13,8,1,4,?
10,7,9,5,0,?
14,2,3,?
},{{13,2,8,4,6,?
11,1,?
10,9,3,?
14,5,0,?
12,7},{1,?
13,8,?
10,3,7,4,?
12,5,6,?
11,0,?
14,9,2},{7,?
11,4,1,9,?
14,2,0,6,?
15,3,5,8},{2,1,?
14,7,4,?
10,8,?
12,9,0,3,5,6,?
11}?
}?
DIREX=?
{16,7,?
21,29,?
17,1,?
26,5,?
10,2,8,?
14,32,?
27,3,9,19,?
30,6,22,?
11,4,?
//左移移位表?
__T=?
{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1?
//压缩换位表2
CutEX=?
{14,?
24,1,5,
3,?
15,6,?
10,23,?
26,8,16,7,?
13,2,41,?
55,30,?
48,44,?
53,46,?
32?
typedef?
char?
ElemType;
ElemType?
subsec;
//Byte转bit?
ByteToBit(ElemType?
bit)?
for(int?
index?
=?
7;
inde__){bit[index]?
(chindex)?
//cout(int)bit[index];
return?
0;
}
//bit转Byte?
BitToByte(ElemType?
ch)?
{ElemType?
tempch=0;
ElemType?
tempbit;
i=0;
ii++){tempbit[i]=bit[i];
tempbit=0;
inde__)
tempch=tempch|(tempbit[index](index));
}ch=tempch;
//cout(char)tempchendl;
return?
}?
//按64位分一组?
void?
Get64Bit(ElemType?
temp;
count=0;
ii++){ByteToBit(ch[i],temp);
j=0;
jj++){?
bit[count*8+j]=temp[7-j];
count++;
}
//初始置换?
InitialEX(ElemType?
{for(int?
ii++){Disorder[i]=Inorder[IP_EX[i]-1];
//逆置换?
AntiEx(ElemType?
ii++){
temp[i]=Disorder[i];
ii++){Disorder[i]=temp[IP_ANTEX[i]-1];
//扩展置换?
ExpandEX(ElemType?
ii++){ExpandMsg[i]=RightMsg[EXTEND[i]-1];
//16轮加密迭代?
MoveLeft(ElemType?
Secret;
//子密钥ElemType?
Result;
//每轮异或结果ElemType?
Sout;
//每轮S盒输出ElemType?
DirOut;
//直接置换输出?
RResult;
LResult;
ExpandMsg;
ii++){LResult[i]=L0[i];
RResult[i]=R0[i];
ii++){if(__T[i]==1){?
jj++)?
{C[i]=C[i+1];
C=0;
}else{?
{
C[i]=C[i+2];
C=0;
ExpandEX(RResult,ExpandMsg);
GetCD48(C,D,Secret);
for(int?
subsec[15-i][j]=Secret[j];
//获取界面的子密钥?
XOR(ExpandMsg,Secret,Result);
//S盒置换?
getSOut(Result,Sout);
DirExchange(Sout,DirOut);
//与L进行异或?
XORLR(DirOut,LResult,temp);
ii++){?
LResult[i]=RResult[i];
RResult[i]=temp[i];
L0[i]=LResult[i];
R0[i]=RResult[i];
/*cout"
zuo"
endl;
ii++){cout(int)LResult[i];
if((i+1)%8==0){?
coutendl;
cout"
右边"
ii++){cout(int)RResult[i];
if((i+1)%8==0)
coutendl;
}*/?
LResult[j]=RResult[j];
RResult[j]=temp[j];
ii++){L0[i]=LResult[i];
R0[i]=RResult[i];
左边"
if((i+1)%8==0){
}}*/?
GetCD48(ElemType?
temp[i]=C[i];
i=28;
ii++)?
ii++){Secret[i]=temp[CutEX[i]];
//48位明文与子密钥进行异或?
/*ExpandMsg?
48位明文,Secret?
48位密钥,Result?
异或结果*/?
void?
XOR(ElemType?
ii++){Result[i]=ExpandMsg[i]^Secret[i];
//S盒四位输出?
getSOut(ElemType?
{int?
row;
col;
ii++){for(int?
temp[j]=Result[i*6+j];
row=temp*2+temp;
col=temp*8+temp*4+temp*2+temp*1;
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;
//直接置换?
DirExchange(ElemType?
ii++){DirOut[i]=Sout[DIREX[i]-1];
//左右异或得到R[i]?
XORLR(ElemType?
ii++){Result[i]=DirOut[i]^Left[i];
_tmain(int?
argc,?
_TCHAR*?
argv[])?
bit;
ch;
Disorder;
right;
left;
expand;
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;
D;
ii++){C[i]=SECRET[i];
D[i]=SECRET[i+28];
cout"
请输入原文:
string?
str;
cinstr;
DivideString(str,1,ch);
Get64Bit(ch,bit);
原64位明文"
ii++){cout(int)bit[i];
置换后的乱序64位明文"
InitialEX(bit,Disorder);
ii++){cout(int)Disorder[i];
}}?
获取右半边明文"
i=32;
ii++){right[i-32]=Disorder[i];
cout(int)right[i-32];
获取左半边明文"
ii++){left[i]=Disorder[i];
cout(int)left[i];
ExpandEX(right,expand);
输出第一次扩展明文"
ii++){cout(int)expand[i];
输出c"
ii++){cout(int)C[i];
if((i+1)%7==0){?
输出d"
ii++){cout(int)D[i];
MoveLeft(C,D,left,right);
SecretOut;
ii++){SecretOut[i]=right[i];
SecretOut[i+32]=left[i];
AntiEx(SecretOut);
密文二进制输出"
ii++)
cout(int)SecretOut[i];
chout;
密文输出"
Bit64ToByte8(SecretOut,chout);
ii++){cout(char)chout[i];
solve;
coutendl"
输入1开始解密"
cinsolve;
if(solve==1){cout"
开始解密"
mDisorder;
mleft;
mright;
mexpand;
InitialEX(SecretOut,mDisorder);
获取右半边密文"
mright[i-32]=mDisorder[i];
cout(int)mright[i-32];
if((i+1)%8==0)?
{coutendl;
获取左半边密文"
mleft[i]=mDisorder[i];
cout(int)mleft[i];
if((i+1)%8==0)?
ExpandEX(mright,mexpand);
en
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 加密 解密 算法 C+ 实现 实验 报告