实验二DES算法Word文件下载.docx
- 文档编号:16337186
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:14
- 大小:75.18KB
实验二DES算法Word文件下载.docx
《实验二DES算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验二DES算法Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
●展开加密循环与函数;
●避免内部循环中使用条件转移指令;
●变量长度与CPU内部寄存器长度相同;
限制变量数量;
●避免使用耗时的指令。
所以,加密软件在实现DES算法时,一般都对算法加以修改,以提高加密效率。
在工具箱的DES算法软件实现中,我们使用了一种修改的DES算法,它的S-盒代替的输入为64位,而不是48位,这样可以在32位计算机很好的执行。
S-盒代替的转换表如下:
(图表)
表6-1-3DES算法S盒置换表
S1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
S2
S3
S4
S5
S6
S7
S8
置换表包了8个S盒SO-S7,每个S盒中有64个元素。
每个S盒由左至右,由上至下读取,64个元素由0开始编号。
使用第1个S盒的第0个元素,SBox[7][9]=0x10040000,代表第7个S盒的第9个元素。
S盒代替具体第9个元素如下:
(1)输入分成两部分,每部分32位,分别记为S0和S1。
(2)将32位S0的第25至30位写入变量S01;
将32位S0的第17至22位写入变量S02;
将32位S0的第9至14位写入变量S03;
将32位S0的第1至6位写入变量S04。
(3)将32位S1的第25至30位写入变量S11;
将32位S1的第17至22位写入变量S12;
将32位S1的第9至14位写入变量S13;
将32位S1的第1至6位写入变量S14;
(4)查找置换表,将SBox[0][S01]、SBox[1][S11]、SBox[2][S02]、SBox[3][S12]、SBox[4][S03]、SBox[5][S13]、SBox[6][S04]、SBox[7][S14]进行或运算,得到的结果即为S盒的输出结果。
例如,64位输入为0x743DED2D02D3B264,那么S盒代替的过程如下:
(1)64位输入分为两部分,S0=0x743DED2D,S1=0x02D3B264。
(2)S01=0x34=52(10)
S02=0x3D=61(10)
S03=0x2D=45(10)
S04=0x2D=45(10)
(3)S11=0x02=2(10)
S12=0x13=19(10)
S13=0x32=50(10)
S14=0x24=36(10)
(4)SBox[0][52]=0x01000004
SBox[1][2]=0x00008000
SBox[2][61]=0x0000008
SBox[3][19]=0x00802001
SBox[4][45]=0x00000100
SBox[5][50]=0x00000000
SBox[6][45]=0x00000802
SBox[7][36]=0x00000040
将以上数据进行或操作,得到结果0x0180A94F就是S盒的输出。
了解了以上的S盒代替方法后,请写出输入为0x843DED9302D#B98B的S盒代替过程数据。
(1)S0=0x843DED93,S1=0x02D3B98B。
(2)S01=___0x04___=_4__10)
S02=___0x3D__=___61__10)
S03=___0x3D___=___61__(10)
S04=___0x13_=___19__(10)
(3)S11=___0x02___=___2___(10)
S12=___0x13___=___19___(10)
S13=___0x39___=__57____(10)
S14=___0x0B__=__11____(10)
三.源码应用(选做)
设计DES加密工具,利用DES加密算法对文件进行加密。
单击工具栏“VC6”按钮,启动VC++6.0。
选择“File”|“OpenWorkspace…”加载工程文件“C:
\JLCSS\Projects\Encrypt\DES.dsw”。
基于此工程进行程序设计。
Main代码如下:
(更改了其它函数的部分代码)
/******************************************************************************/
//工程:
DES
//功能:
DES加、解密文件
//作者:
jlcss|ExpNIS
#include<
stdio.h>
string.h>
stdlib.h>
afxwin.h>
#include"
des.h"
#defineDECRYPT_FILE"
DES加密密文.txt"
#defineENCRYPT_FILE"
DES解密明文.txt"
//!
约束文件最大2M
#defineMAX_FILE1024*1024*2
//名称:
usage
帮助信息
//参数:
应用程序名称
//返回:
提示信息
voidUsage(constchar*appname)
{
printf("
\n\tusage:
des-e明文文件64位密钥\n"
);
\tusage:
des-d密文文件64位密钥\n"
}
FileIn
读取磁盘文件到内存
strFile:
文件名称;
inBuff:
指向文件内容缓冲区
实际读取内容大小(字节)
intFileIn(constchar*strFile,unsignedchar*&
inBuff)
intiFileLen=0;
//!
打开密文文件
CFilefile(strFile,CFile:
:
modeRead);
iFileLen=(int)file.GetLength();
if(iFileLen>
MAX_FILE)
{
printf("
文件长度不能大于%dM,!
\n"
MAX_FILE/(1024*1024));
gotoout;
}
inBuff=newunsignedchar[iFileLen+1];
if(!
file.Read(inBuff,iFileLen);
file.Close();
inBuff[iFileLen]=0;
out:
returniFileLen;
FileOut
加/解密结果输出到当前目录磁盘文件中
strOut指向输出字符缓冲区,输出大小len,strFile为输出文件
无
voidFileOut(constvoid*strOut,constchar*strFile)
输出到文件
intlen=64;
CFileoutfile(strFile,CFile:
modeCreate|CFile:
modeWrite);
outfile.Write(strOut,len);
outfile.Close();
CheckParse
校验应用程序入口参数
argc等于main主函数argc参数,argv指向main主函数argv参数
若参数合法返回true,否则返回false
//备注:
简单的入口参数校验
boolCheckParse(intargc,char**argv)
if((argc!
=4)||
(argv[1][1]!
='
e'
&
&
argv[1][1]!
d'
)||
(strlen(argv[3])>
(64/8)))
Usage(argv[0]);
returnfalse;
returntrue;
/**********************************************************************************/
/**************为了使程序代码变的显得简洁易懂,特编写下边函数**********************/
//用于清除回车键缓存的影响
voidsafe_flush(FILE*fp)
intch;
while((ch=fgetc(fp))!
=EOF&
ch!
='
\n'
voidEncryption()
//k1:
密钥低位;
k2:
密钥高位;
c1:
32位密文(左);
c2:
32密文(右);
m1:
明文(左);
m2:
明文(右);
intk1=0;
printf("
请输入密钥低位:
"
);
scanf("
%d"
&
k1);
intk2=0;
请输入密钥高位:
intm1=0;
请输入明文(左):
m1);
safe_flush(stdin);
intm2=0;
请输入明文(右):
%u"
m2);
unsignedc1=0;
unsignedc2=0;
charstrOut1[50];
charstrFile1[50];
请输入你要加密后的文件路径:
gets(strFile1);
des_encrypt(k1,k2,m1,m2,c1,c2);
FileOut(strOut1,strFile1);
voidDecryption()
intc1=0;
请输入密文(左):
c1);
intc2=0;
请输入密文(右):
c2);
unsignedm1=0;
unsignedm2=0;
charstrOut[80];
charstrFile[80];
请输入你要解密后的文件路径:
gets(strFile);
des_decrypt(k1,k2,c1,c2,m1,m2);
FileOut(strOut,strFile);
intmenu()
printf("
\n\n\t******************************************************\n\n"
\t加密请输入:
1解密请输入:
2退出请输入:
3\n\n"
\t******************************************************\n"
inttemp;
scanf("
temp);
safe_flush(stdin);
if(temp==3)
感谢使用加密解密程序!
return0;
elseif(temp!
=3)
if(temp==1||temp==2)
{
switch(temp)
{
case1:
Encryption();
menu();
break;
case2:
Decryption();
default:
break;
}
}
else
printf("
请输入一个正确的选择!
else
return0;
程序主函数(UseMFCinaSharedDLL)
intmain(intargc,char**argv)
在此处填写代码......
CheckParse(argc,argv))
menu();
运行结果如下:
(1)加密如下:
生成文件如下:
(2)解密如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 DES 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)