当前位置:文档之家› DES_加密解密算法的C++实现--实验报告

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

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

实验一

1、实验题目

利用C/C++编程实现DES加密算法或MD5加密算法。我选择的是用C++语言实现

DES的加密算法。

2、实验目的

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

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

操作系统:WIN7旗舰版

开发工具:VisualStudio2010旗舰版开发语言: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的加密,代码的主要几个函数如下:

代码

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

#include""#include""#include#include#includeusingnamespacestd;

//置换矩阵

intIP_EX[64]={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

};

intIP_ANTEX[64]={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

};

//扩展矩阵

intEXTEND[48]={

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,2 4,25,26,27,28,29,28,29,30,31,1,2

};

//S盒intS[8][4][16]={{{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,1 3,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}

}

};

intDIREX[32]={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

};

//左移移位表

intMOVELEFT[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

};

//压缩换位表2

intCutEX[48]={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,5 6,34,53,46,42,50,36,29,32

};

typedefcharElemType;

ElemTypesubsec[16][48];

//Byte转bit

intByteToBit(ElemTypech,ElemTypebit[8]){

for(intindex=7;index>=0;index--){bit[index]=(ch>>index)&1;//cout<<(int)bit[index];}

return0;}

intBitToByte(ElemTypebit[8],ElemType&ch){ElemTypetempch=0;ElemTypetempbit[8];for(inti=0;i< 8;i++){tempbit[i]=bit[i];

}

tempbit[7]=0;

for(intindex=7;index>=0;index--)

{

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

//cout<<(char)tempch<

return0;

}

//按64位分一组

voidGet64Bit(ElemTypech[8],ElemTypebit[64]){ElemTypetemp[8];intcount=0;for(inti=0;i<8;i++){B yteToBit(ch[i],temp);for(intj=0;j<8;j++){bit[count*8+j]=temp[7-j];

}

count++;

}

}

//初始置换

voidInitialEX(ElemTypeInorder[64],ElemTypeDisorder[64]){for(inti=0;i<64;i++){Disorder[i]=Inorder [IP_EX[i]-1];}

}

//逆置换

voidAntiEx(ElemTypeDisorder[64]){ElemTypetemp[64];for(inti=0;i<64;i++){

temp[i]=Disorder[i];

}

for(inti=0;i<64;i++){Disorder[i]=temp[IP_ANTEX[i]-1];

}

}

//扩展置换

voidExpandEX(ElemTypeRightMsg[32],ElemTypeExpandMsg[48]){

for(inti=0;i<48;i++){ExpandMsg[i]=RightMsg[EXTEND[i]-1];

}

}

//16轮加密迭代

voidMoveLeft(ElemTypeC[28],ElemTypeD[28],ElemTypeL0[32],ElemTypeR0[32]){ElemTypeSecret[ 48];//子密钥ElemTypeResult[48];//每轮异或结果ElemTypeSout[32];

//每轮S盒输出ElemTypeDirOut[32];//直接置换输出

ElemTypeRResult[32];ElemTypeLResult[32];ElemTypeExpandMsg[48];ElemTypetemp[32];for(inti= 0;i<32;i++){LResult[i]=L0[i];

}

for(inti=0;i<16;i++){if(MOVELEFT[i]==1){for(intj=0;j<27;j++){C[i]=C[i+1];

}

C[27]=0;

}else{for(intj=0;j<26;j++){

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

C[26]=0;C[27]=0;

}

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

for(intj=0;j<48;j++)

{

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

}

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

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

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

XORLR(DirOut,LResult,temp);for(inti=0;i<32;i++){LResult[i]=RResult[i];

}

for(inti=0;i<32;i++){

RResult[i]=temp[i];}

for(inti=0;i<32;i++){L0[i]=LResult[i];R0[i]=RResult[i];

}

}

/*cout<<"zuo"<

}

cout<<"右边"<

{

cout<

}

}*/

LResult[j]=RResult[j];

}

for(intj=0;j<32;j++){RResult[j]=temp[j];

}

}

for(inti=0;i<32;i++){L0[i]=LResult[i];

R0[i]=RResult[i];

}

/*cout<<"左边"<

}

}

cout<<"右边"<

cout<

}

//生成48位子密钥

voidGetCD48(ElemTypeC[28],ElemTypeD[28],ElemTypeSecret[48]){ElemTypetemp[56];for(inti=0;i <28;i++){

temp[i]=C[i];}

for(inti=28;i<56;i++)

{

temp[i]=C[i];}

for(inti=0;i<48;i++){Secret[i]=temp[CutEX[i]];

}

}

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

/*ExpandMsg[48]48位明文,Secret[48]48位密钥,Result[48]异或结果

*/voidXOR(ElemTypeExpandMsg[48],ElemTypeSecret[48],ElemTypeResult[48]){for(inti=0;i<48;i++ ){Result[i]=ExpandMsg[i]^Secret[i];

}

}

//S盒四位输出

voidgetSOut(ElemTypeResult[48],ElemTypeSout[32]){introw;intcol;

ElemTypetemp[6];for(inti=0;i<8;i++){for(intj=0;j<6;j++){temp[j]=Result[i*6+j];}

row=temp[0]*2+temp[5];

col=temp[1]*8+temp[2]*4+temp[3]*2+temp[4]*1;intk=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;

}

}

//直接置换

voidDirExchange(ElemTypeSout[32],ElemTypeDirOut[32]){

for(inti=0;i<32;i++){DirOut[i]=Sout[DIREX[i]-1];

}

}

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

voidXORLR(ElemTypeDirOut[32],ElemTypeLeft[32],ElemTypeResult[32]){for(inti=0;i<32;i++){Resul t[i]=DirOut[i]^Left[i];

}

}

void_tmain(intargc,_TCHAR*argv[]){ElemTypebit[64];ElemTypech[8];ElemTypeDisorder[64];Elem Typeright[32];ElemTypeleft[32];ElemTypeexpand[48];ElemTypeSECRET[56]={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与D0ElemTypeC[28];ElemTypeD[28];for(inti=0;i<28;i++){C[i]=SECRET[i];

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

}

cout<<"请输入原文:"<

stringstr;

cin>>str;

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

cout<<"<<<<<<<<<原64位明

文>>>>>>>>>"<

}

}

cout<

cout<<"<<<<<<<<<置换后的乱序64位明

文>>>>>>>>>"<

cout<

cout<

cout<<"<<<<<<<<<获取右半边明

文>>>>>>>>>"<

}

}

cout<

cout<<"<<<<<<<<<获取左半边明

文>>>>>>>>>"<

}

}

cout<

ExpandEX(right,expand);

cout<<"<<<<<<<<<输出第一次扩展明

文>>>>>>>>>"<

}

}

cout<

cout<<"<<<<<<<<<输出

c>>>>>>>>>"<

}

}

cout<

cout<<"<<<<<<<<<输出

d>>>>>>>>>"<

}

cout<

MoveLeft(C,D,left,right);ElemTypeSecretOut[64];for(inti=0;i<32;i++){SecretOut[i]=right[i]; SecretOut[i+32]=left[i];

}

AntiEx(SecretOut);

cout<<"<<<<<<<<<密文二进制输出>>>>>>>>>"<

{

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

}

}

cout<

ElemTypechout[8];

cout<<"<<<<<<<<<密文输

出>>>>>>>>>"<

cout<

intsolve;

cout<

密>>>>>>>>>"<>solve;if(solve==1){cout<<"<<<<<<<<<开始解密>>>>>>>>>"<

InitialEX(SecretOut,mDisorder);

cout<<"<<<<<<<<<获取右半边密

文>>>>>>>>>"<

}

}

cout<

cout<<"<<<<<<<<<获取左半边密

文>>>>>>>>>"<

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

{

cout<

cout<

ExpandEX(mright,mexpand);

cout<<"<<<<<<<<<输出第一次扩展明

文>>>>>>>>>"<

}

cout<

mMoveLeft(C,D,mleft,mright);ElemTypemSecretOut[64];for(inti=0;i<32;i++){

mSecretOut[i]=mright[i];mSecretOut[i+32]=mleft[i];}

AntiEx(mSecretOut);

cout<<"<<<<<<<<<原文二进制输

出>>>>>>>>>"<

}

cout<

ElemTypemchout[8];

cout<<"<<<<<<<<出>>>>>>>>>"<

}

cout<

}

}

7、实验结果

1、根据提示,输入任意8字节的原文,并将其转换为64为二进制明文:

2、将64为二进制明文进行初始置换:

3、将原64位明文分成左右两半,并对右半边进行扩展置换:

4依次获得子密钥。按上述流程完成16轮迭代运算后进行终结置换,得到64位密文(整个过程设计数据过多,没有一一输出,只给出最终截图内容)

5.按1开始进行解密,流程与加密相同,中间过程省去,只给出最终结果:

8、实验总结

通过完成本实验,我详细了解了DES算法的实现过程和工作原理,相比较在课堂上学到的理论知识,我认为通过实践后掌握的更加深刻。在课堂上我们学习DES算法,很多都是基于理论上的知识,但并没有真正的使用过DES,而通过编码实现DES,我们更好地理解了该怎么用DES去解决实际问题,这对我们以后的学习是很有帮助的,掌握了DES的算法实现后,我们在以后写到相关程序时可以快速的将其利用,使其真正的为我们服务。

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网络结构,其特点是:加密和解密使用同一算法、

DES算法实验报告

信息安全实验报告 题目DES算法 姓名学号 专业年级计算机科学与技术2014级(1)班指导教师 2016年12 月10日

一、实验目的 了解DES加密算法及原理,掌握其基本应用。 二、实验容 DES加密算法的JAVA实现 三、实验原理 DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。 1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图2-1所示:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表 58 50 42 34 26 18 10 2 IP 60 52 44 36 28 20 12 4

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 该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规则为: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。 R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 IP-1 40 8 48 16 56 24 64 32

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加密算法实验报告

苏州科技学院 实验报告 学生姓名:杨刘涛学号:1220126117 指导教师:陶滔 刘学书1220126114 实验地点:计算机学院大楼东309 实验时间:2015-04-20 一、实验室名称:软件实验室 二、实验项目名称:DES加解密算法实现 三、实验学时:4学时 四、实验原理: DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串 f1,f1与L0做不进位的二进制加法运算。运算规则为: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。 R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 经过置换IP-1后生成的比特串就是密文e。 变换f(Ri-1,Ki): 它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:

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加密算法 班级与班级代码07电商1班072511031 实验室名称(或课室)实验大楼809 专业 2007电子商务1班 任课教师 学号:072511031 姓名: 机器号码:3组F(周二) 实验日期:2010年10月19 日 广东商学院教务处制

姓名汪江实验报告成绩 评语: 指导教师(签名) 年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

实验二 DES加密算法 实验目的 1、理解对称加密算法的原理和特点。 2、理解DES和AES算法的加密原理。 实验原理 DES是一种分组加密算法,所谓分组加密算法就是对一定大小的明文或密文来做加密或解密动作。而在DES这个加密系统中,每次加密或解密的分组大小均为64位,所以DES没有密文扩充的问题。对大于64位的明文只要按每64位一组进行切割,而对小于64位的明文只要在后面补“0”即可。 另一方面,DES所用的加密或解密密钥也是64位大小,但因其中有8个位是用来作奇偶校验的,所以64位中真正起密钥作用的只有56位,密钥过短也是DES最大的缺点。 DES加密与解密所用的算法除了子密钥的顺序不同外,其他部分完全相同。 实验设备 Windows虚拟机 CIS工具箱——该实验使用加密解密工具。 实验步骤 step 1:输入明文数据和密钥是一样的,都为本人的学号后8位(51103119)。明文和密钥要求键盘输入8个字符,在系统里换算成asc码就变成16进制的16个字符实验结果。如图1所示。 图1

step 2:点击“密钥生成演示”,可以得到第一次迭代后的64位密钥、 56位密钥、Ci 、Di 、Ci+1、Di+1、子密钥。如图2所示。 图2 64位密钥的二进制矩阵如下: 56位压缩密钥的二进制矩阵如下: Ci 的二进制矩阵如下: Di 的二进制矩阵如下:

DES实验报告

DES加密算法 一、实验目的 1、理解对称加密算法的原理和特点 2、理解DES算法的加密原理 二、实验步骤 第一阶段:64位明文进行初始置换IP(initial permutation) 第二阶段:在密钥控制下16轮迭代 第三阶段:交换左右32比特 IP 第四阶段:初识逆置换1 三、实验原理 对称密钥机制即对称密钥体系,也称为单钥密码体系和传统密码体系。对称密码体系通常分为两大类,一类是分组密码(如DES、AES算法),另一类是序列密码(如RC4算法)。对称密码体系加密和解密时所用的密钥是相同的或者是类似的,即由加密密钥可以很容易地推导出解密密钥,反之亦然。同时在一个密码系统中,我们不能假定加密算法和解密算法是保密的,因此密钥必须保密。发送信息的通道往往是不可靠的或者不安全的,所以在对称密码系统中,必须用不同于发送信息的另外一个安全信道来发送密钥。 四、实验内容 第一阶段:置换规则如下矩阵,即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是 输出的左32位,R0 是右32位,例:设置换前的输入值為D1D2D3 (64) 则经过初始置换后的结果為:L0=D550...D8;R0=D57D49 (7) 第二阶段: 1、变换密钥 取得64位的密钥,每个第8位作为奇偶校验位,舍弃64位密钥中的奇偶校验位,根据下表PC-1进行密钥变换得到56位的密钥。将变换后的密钥分为两个部分,开始的28位称为C0,最后的28位成为D0。然后同时将C0、D0循环左移1位形成C1、D1。C1D1经过PC-2从56位中选出48位输出,即为K1。循环左移LSi(i=1,2,……,16)分别是: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2。依次类推直至K16形成。 2、加密数据 将32位的RI-1按下表(E)扩展为48位的EI-1: 异或Ei-1和Ki,即E[i-1] XOR K[i],将异或后的结果分为8个6位长的部分,第1

C语言实现DES算法实验报告分析

xx工程大学 实验报告 (2015-2016学年第一学期)报告题目:DES加密算法 课程名称:密码学B 任课教员: 专业: 学号: 姓名: 二O一六年一月十八日

一、课程概述 目的:培养学员的编程能力,理解算法原理。 要求:给出DES算法的软件实现,测试DES的加密速度。 二、设计思路 使用C++语言进行编程,简化了输入输出语句。预处理时加入了iostream包。使用了std名字空间。 加密时程序输入的明文是8个ascii码,生成一个16个16进制数的密文。 脱密时程序输入的密文是16个16进制数,生成一个8个ascii码的明文。 加脱密所用密钥均由16个16进制数组成。 其中16进制数全部使用大写字母。 程序中大量使用了的布尔数组,一个bool型变量只占用一位存储空间,比int型、char型变量要小的多。这降低了程序的空间复杂度。 三、采取的方案 本程序是将一个由8个ascii码组成的明文分组加密,生成一个由16个16进制数组成的密文。或将一个由16个16进制数组成的密文进行脱密,生成一个由8个ascii 码组成的明文。所用密钥由16个16进制数组成。 本实验按照输入数据及初始置换、16圈迭代、子密钥生成和逆初始置换及输出数据四个步骤实现加密算法设计。 1、输入数据及初始置换 本程序首先会提示用户输入加密脱密识别码,加密输入1,脱密输入0,将此识别码存入整形变量o。根据o的不同值,提示用户输入8个字符(加密)或16个16进制

数(脱密)。输入的明文或密文转化为二进制数后储存到布尔型数组m[65]中。 初始置换通过函数IP 完成,函数输入为原始明文m ,函数将输出结果保存到布尔型数组mip[65]中。函数思想为查表,含有一个整形变量数组ip[64],保存初始变换表IP 。将mip 的第i 位赋值为m 的第ip[i]位。 2、子密钥生成 输入16个16进制数的密钥后,将密钥保存在一个16位字符数组c 中,通过ToEr 函数将之变为二进制数。ToEr 函数输入为字符数组,通过switch 语句逐个检查字符数组的每一位,将对应的四位二进制数存在64位布尔数组k 中。 64 bit 密钥去掉每个字节的最高位得到56 bit 密钥输入,通过置换选择1变换得到 0C 和0D 各28 bit ,通过Zhihuan_1函数实现置换选择一。Zhihuan_1函数输入为二进制密钥数组k[64],输出为C0和D0,将C0、D0分别储存在28位布尔数组C 、D 中。函数采用查表方式生成C0和D0。 根据迭代的轮数确定C 和D 移位循环的位数,主程序中利用一个16位整形数组来存放每一次循环左移的位数。循环左移通过XunHuan 函数实现,函数输入为循环位数和长度为28的布尔数组(C 或者D ),函数运行一次只能改变一个布尔数组的值。为了减低编程复杂度,程序使用串行方法,分两次进行C 、D 的移位。 每完成一次C 和D 的移位,进行一次置换选择二。置换选择二利用zhihuan_2函数完成。思想和Zhihuan_1函数类似。zhihuan_2函数输入为移位后的C 、D ,zhihuan_2函数将圈子密钥存放在16*48的二维布尔数组kk[17][49] 中。kk[i][48]表示第i 圈的圈子密钥。原理图如图1所示。 脱密(o=0时)需要将圈子密钥交换,此时可利用kk[0][49]充当中间变量,无需定义新的变量减少了系统开销。

DES算法实验报告

DES算法实验报告 导读:就爱阅读网友为您分享以下“DES算法实验报告”的资讯,希望对您有所帮助,感谢您对https://www.doczj.com/doc/a712870473.html,的支持! 实验报告 姓名:xxxx 学号:0XXXXX 班级:XXXXXXX 日期:2013/11/* 题目:DES算法实验 一、实验环境 1.硬件配置: 处理器:Inter(R) Core(TM) i5-2430M CPU @ 2.40GHz (4

CPUs) ,~2.4GHz 内存:2048MB RAM 2.使用软件: (1) 操作系统:win7 旗舰版 (2) 软件工具: Microsoft Visual c++ 6.0 二、实验涉及的相关概念或基本原理 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES 的所有的保密性均依赖于密钥。 DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。 1.加密处理过程(1)初始置换IP。加密处理首先要对64位的明文按表1所示的初始换位表IP进行变换。表中的数值表示输入位被置换后的新位置。

(2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始置换的64位的输出作为下一次的输入,将64位分为左、右两个32位,分别记为L0和R0,从L0、R0到L16、R16,共进行16轮加密变换。其中,经过i轮处理后的点左右32位分别为Li和Ri则可做如下定义: Li=Ri-1 Ri=Li-1 ⊕F(Ri-1,K) 其中,F为F变换 (3)最后换位。进行16轮的加密变换之后,将L16和R16合成64位的数据,再按照表2所示的最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。 2.加密变换过程 64位的密钥先由置换选择1减少至56六位,进行循环左移,然后通过置换选择2减少至48位。而通过扩展运算将32位按表3扩展换位表扩展为48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒

DES算法实验报告

DES算法实验报告 一、程序总体框架 二、程序实现流程 DES加密算法是分组加密算法,明文以64位为单位分成块。64位数据在64位密钥的控制下,经过初始变换后,进行16轮加密迭代:64位数据被分成左右两半部分,每部分32位,密钥与右半部分相结合,然后再与左半部分相结合,结果作为新的右半部分;结合前的右半部分作为新的左半部分。这一系列步骤组成一轮,这种轮换要重复16次。最后一轮之后,再进行初始置换的逆置换,就得到了64位的密文。 具体流程如下图所示:

DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。 1.加密处理过程

(1)初始置换IP。加密处理首先要对64位的明文按表1所示的初始换位表IP 进行变换。表中的数值表示输入位被置换后的新位置。 (2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始置换的64位的输出作为下一次的输入,将64位分为左、右两个32位,分别记为L0和R0,从L0、R0到L16、R16,共进行16轮加密变换。其中,经过i轮处理后的点左右32位分别为L i和R i则可做如下定义: L i=R i-1 R i=L i-1⊕F(R i-1,K) 其中,F为F变换 (3)最后换位。进行16轮的加密变换之后,将L16和R16合成64位的数据,再按照表2所示的最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。 2.加密变换过程

64位的密钥先由置换选择1减少至56六位,进行循环左移,然后通过置换选择2减少至48位。而通过扩展运算将32位按表3扩展换位表扩展为48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒将这48位替代成新的32位数据。 按此进行,输出32位,再按照表4 换位表P进行变换,这样就完成了F(R,K)的变换。 3.子密钥生成过程 密钥通常表示为64位的自然数,首先通过压缩换位Key_Exchange去掉每个字节的第8位,用作奇偶校验。因此,密钥去掉第8、16、24……64位减至56位,所以实际密钥长度为56位。而每轮要生成48位的子密钥。输入的64位密钥,

DES实验报告

[实验项目] DES [实验目的] C语言实现des加密解密 [实验原理] 1.DES的加密过程: 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i 次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16)。 2.DES解密过程: DES的解密算法与其加密算法使用的算法过程相同。两者的不同之处在于解密时子密钥Ki的使用顺序与加密时相反,如果子密钥为K1K2…K16,那么解密时子密钥的使用顺序为K16K15…K1,即使用DES解密算法进行解密时,将以64位密文作为输入,第1次迭代运算使用子密钥K16,第2次迭代运算使用子密钥K15,……,第16 次迭代使用子密钥K1,其它的运算与加密算法相同。这样,最后输出的是64位明文。[设计内容] [设计过程] /*------------------------------------------------------- Data Encryption Standard 56位密钥加密64位数据 --------------------------------------------------------*/ #include #include #include "bool.h" // 位处理 #include "tables.h" void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字节到位 void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字节 void BitToHex(char *DatOut,bool *DatIn,int Num); // 二进制到十六进制 64位 to 4*16字符 void HexToBit(bool *DatOut,char *DatIn,int Num); // 十六进制到二进制 void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); // 位表置换函数 void LoopMove(bool *DatIn,int Len,int Num); // 循环左移 Len长度 Num移动位数 void Xor(bool *DatA,bool *DatB,int Num); // 异或函数 void S_Change(bool DatOut[32],bool DatIn[48]); // S盒变换 void F_Change(bool DatIn[32],bool DatKi[48]); // F函数 void SetKey(char KeyIn[8]); // 设置密钥 void PlayDes(char MesOut[8],char MesIn[8]); // 执行DES加密 void KickDes(char MesOut[8],char MesIn[8]); // 执行DES解密 int main() { int i=0; char MesHex[16]={0}; // 16个字符数组用于存放 64位16进制的密文

C语言实现DES算法实验报告

XX工程大学 实验报告 (2015-2016学年第一学期)报告题目:DES 加密算法______________ 课程名称: _____________ 密码学B ________________ 任课教员: _______________________________________ 专业: __________________________________________ 学号: __________________________________________ 姓名: __________________________________________

O一六年一月十八日 '、课程概述 目的:培养学员的编程能力,理解算法原理 要求:给出DES算法的软件实现,测试DES勺加密速度。 二、设计思路 使用C++语言进行编程,简化了输入输出语句。预处理时加入了iostream包。使用了std 名字空间。 加密时程序输入的明文是8个ascii码,生成一个16个16进制数的密文。 脱密时程序输入的密文是16个16进制数,生成一个8个ascii码的明文。 加脱密所用密钥均由16个16进制数组成。 其中16进制数全部使用大写字母。 程序中大量使用了的布尔数组,一个bool型变量只占用一位存储空间,比int型、char 型变量要小的多。这降低了程序的空间复杂度。 三、采取的方案 本程序是将一个由8个ascii码组成的明文分组加密,生成一个由16个16进制数组成的密文。或将一个由16个16进制数组成的密文进行脱密,生成一个由 8个ascii 码组成的明文。所用密钥由16个16进制数组成。 本实验按照输入数据及初始置换、16圈迭代、子密钥生成和逆初始置换及输出数据 四个步骤实现加密算法设计。 1、输入数据及初始置换 本程序首先会提示用户输入加密脱密识别码,加密输入 1,脱密输入0,将此识别码存入整形变量0。根据o的不同值,提示用户输入8个字符(加密)或16个16进制数(脱密)。输入的明文或密文转化为二进制数后储存到布尔型数组 m[65]中。 初始置换通过函数IP完成,函数输入为原始明文 m函数将输出结果保存到布尔型数组mip[65]中。函数思想为查表,含有一个整形变量数组ip[64],保存初始变换表IP。将mip 的第i位赋值为m的第ip[i]位。

实现DES加解密算法实验报告

实现DES加解密算法实验报告 一、DES加解密算法问题简介 DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密。 二、DES加解密算法设计方法简介 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......D8;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, 2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25, 在f(Ri,Ki)算法描述图中,S1,S2...S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2......8)的功能表: 选择函数Si S1:

密码学-DES实验报告

南京信息工程大学实验(实习)报告实验(实习)名称实验(实习)日期得分指导教师------ 系计算机专业软件工程年2011 班次 3 姓名唐一鑫学号24 一.实验目的 1.理解对称加密算法的原理和特点 2.理解DES算法的加密原理 二.实验内容 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16)

三.流程图&原理图 流程图

DES原理图

des加密算法分析实验报告

百度文库- 让每个人平等地提升自我 中北大学软件学院《信息安全技术》 实验报告 课程名称:信息安全原理与实践实验名称:DES加密算法 指导教师: 学生姓名: 组号: 实验日期:20160415 实验地点:软件学院 实验成绩:

通过用DES算法对实际数据进行加密和解密来深刻了解DES的运行原理,进而加深对对称加密算法的理解与认识。

1)合天网按实验平台 2)操作系统:运行Windows ,VS2010编译环境。 3)验证软件:CAP(Cryptographic Analysis Program v4)软件,该软件位于桌面“cap4” 文件夹内。

三、实验内容与实验要求 1)使用cap实现DES算法的加解密 2)根据对DES算法的介绍,自己创建明文信息,并选择一个密钥,编写DES密码算法的实 现程序,实现加密和解密操作,并算结果将CAP4的运进行比较 DES加解密算法的原理 DES算法的加密流程图及参数: DES的参数: 1.密钥长度:56比特 2.输入:64比特 3.输出:64比特 4.运算轮数:16

DES解密过程与加密过程完全相似,只不过将16次迭代的子密钥顺序倒过来,即 m = DES-1(c) = IP-1 ? T1?T2?.....T15? T16 ? IP(c) 可以证明, DES-1 (DES (m) )=m 使用cap实现DES算法的加解密 在“plaintext”框内输入需要加密的字符,本例输入“beijing”,在"Ciph ers"菜单中选择“des”,出现des Cipher对话框,在密钥框中输入8位密钥:“12345678”,点击“Encipher”,如下图: 可以在上图看到加密成功,在“ciphertest”框出现二进制的密文。 加密操作完成。 解密操作如下: 将密文复制到Ciphertext中,选择“Ciphers”菜单,选择“DES”算法,输入正确的数值产生密钥,点击“Decipher”进行解密,结果返回明文。 尝试不同的值,观察返回的明文。

实验2 对称加密算法:DES

实验1-2 对称密码算法DES 一.实验原理 信息加密根据采用的密钥类型可以划分为对称密码算法和非对称密码算法。对称密码算法是指加密系统的加密密钥和解密密钥相同,或者虽然不同,但是可以从其中任意一个推导出另一个,更形象的说就是用同一把钥匙开锁和解锁。在对称密码算法的发展历史中曾出现过多种优秀的算法,包括DES、3DES、AES等。下面我们以DES算法为例介绍对称密码算法的实现机制。 DES算法是有美国IBM公司在20世纪70年代提出,并被美国政府、美国国家标准局和美国国家标准协会采纳和承认的一种标准加密算法。它属于分组加密算法,即明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。混淆和扩散是它采用的两个最重要的安全特性,混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。扩散是指明文和密钥中每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码安全。 DES将明文分成64比特位大小的众多数据块,即分组长度为64位。同时用56位密钥对64位明文信息加密,最终形成64位的密文。如果明文长度不足64位,则将其扩展为64位(例如补零等方法)。具体加密过程首先是将输入的数据进行初始换位(IP),即将明文M 中数据的排列顺序按一定的规则重新排列,生成新的数据序列,以打乱原来的次序。然后将变换后的数据平分成左右两部分,左边记为L0,右边记为R0,然后对R0施行在子密钥(由加密密钥产生)控制下的变换f,结果记为f(R0 ,K1),再与L0做逐位异或运算,其结果记为R1,R0则作为下一轮的L1。如此循环16轮,最后得到L16、R16,再对L16、R16施行逆初始置换IP-1,即可得到加密数据。解密过程与此类似,不同之处仅在于子密钥的使用顺序正好相反。 DES全部16轮的加密过程如图1-1所示。 DES的加密算法包括3个基本函数: 1.初始换位(IP) 它的作用是把输入的64位数据块的排列顺序打乱,每位数据按照下面换位规则重新组合。即将第58位换到第1位,第50位换到第2位,…,依次类推。重组后的64位输出分为L0、R0(左、右)两部分,每部分分别为32位。 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 R0和K1经过f(R0,K1)变换后的输出结果,再和L0进行异或运算,输出结果做为R1。R0则赋给L1。L1和R1同样再做类似运算生成L2和R2,…,经过16次运算后生成L16和R16。 2.f函数 f函数是多个置换函数和替代函数的组合函数,它将32位比特的输入变换为32位的输出,如图1-2。R i经过扩展运算E变换后扩展为48比特的E(R i),与K i+1进行异或运算后输出的结果分成8组,每组6比特的并联B,B=B1B2B3B4B5B6B7B8,再经过8个S盒的选择压缩运算转换为4比特,8个4比特合并为32比特后再经过P变换输出为32比特的f(R i-1,K i)。其中,扩展运算E与置换P主要作用是增加算法的扩散效果。

DES算法实验报告

实验报告 姓名:xxxx学号:0XXXXX班级:XXXXXXX日期:2013/11/* 题目:DES算法实验 一、实验环境 1.硬件配置: 处理器:Inter(R) Core(TM) i5-2430M CPU @ 2.40GHz (4 CPUs) ,~2.4GHz 内存:2048MB RAM 2.使用软件: (1) 操作系统:win7 旗舰版 (2) 软件工具:Microsoft Visual c++ 6.0 二、实验涉及的相关概念或基本原理 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。 1.加密处理过程 (1)初始置换IP。加密处理首先要对64位的明文按表1所示的初始换位表IP进行变换。表中的数值表示输入位被置换后的新位置。

(2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始置换的64位的输出 作为下一次的输入,将64位分为左、右两个32位,分别记为L 0和R ,从L 、R 到L 16 、R 16 , 共进行16轮加密变换。其中,经过i轮处理后的点左右32位分别为L i 和R i 则可做如下定 义: L i =R i-1 R i =L i-1 ⊕F(R i-1 ,K) 其中,F为F变换 (3)最后换位。进行16轮的加密变换之后,将L 16和R 16 合成64位的数据,再按照表2所示 的最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。 2.加密变换过程 64位的密钥先由置换选择1减少至56六位,进行循环左移,然后通过置换选择2减少至48位。而通过扩展运算将32位按表3扩展换位表扩展为48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒将这48位替代成新的32位数据。

相关主题
文本预览
相关文档 最新文档