DES源代码分析DES课程设计报告.docx
- 文档编号:23199075
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:27
- 大小:349.93KB
DES源代码分析DES课程设计报告.docx
《DES源代码分析DES课程设计报告.docx》由会员分享,可在线阅读,更多相关《DES源代码分析DES课程设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
DES源代码分析DES课程设计报告
网络安全
课程设计报告
学院:
计算机与电子信息学院
专业名称:
学号:
姓名:
指导教师:
时间:
2015年1月
DES源代码分析
一、DES对称加密算法简介
最著名的保密密钥或对称密钥加密算法DES(DataEncryptionStandard)是由IBM公司在70年代发展起来的,并经过政府的加密标准筛选后,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(AmericanNationalStandardInstitute,ANSI)承认。
DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。
与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。
DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,但幸运的是当时大多数黑客并没有足够的设备制造出这种硬件设备。
在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。
所以,当时DES被认为是一种十分强壮的加密方法。
二、DES对称加密算法分析
(1)DES算法原理
在DES算法中有Data、Key、Mode三个参数。
其中Data代表需要加密或解密的数据,由8字节64位组成;Key代表加密或解密的密钥,也由8字节64位组成;Mode代表加密或解密的状态。
在DES算法中加密和解密的原理是一样的,只是因为Mode的状态不同,适用密钥的顺序不同而已。
(2)DES算法的加密过程
DES算法的加密过程如图6.2所示。
初始置换(InitialPermutation,IP)是对输入的64位数据按照规定的矩阵改变数据位的排列顺序的换位变换,此过程与密钥无关。
子密钥生成是由64位外部输入密钥通过置换和移位操作生成加密和解密所需的16组(每组56位)子密钥的过程。
乘积变换过程非常复杂,是加密过程的关键。
该过程通过16轮重复的替代、移位、异或和置换操作打乱原输入数据。
逆初始置换(IP-1)与初始置换过程相同,只是置换矩阵是初始置换的逆矩阵。
①初始置换(IP)
将64位明文按照初始置换表(如表6.1)的规则进行置换。
其置换过程为:
将输入明文的第58位置换到第1位,第50位置换到第2位,第12位置换到第3位,依此类推,……,最后第7位置换到第64位。
②子密钥生成
输入的密钥K是64位数据,但其中第8、16、24、32、40、48、56、64位用于奇偶校验,实际使用的密钥位只有56位。
子密钥Ki的生成流程如图6.3所示。
第1步:
PC1变换。
将56位密钥按置换选择1(PC-1)的规律(见表6.2)进行置换,变换后分为左右两路(C0、D0)各28位。
第2步:
数据左移。
将两个28位的C0和D0按表6.3的规则进行循环左移。
表6.3中第1行表示迭代轮次,第2行表示左移的位数。
左移的规律是将C0和D0所有的位按表中规定的位数循环左移。
第3步:
PC2变换和子密钥生成。
C0和D0左移1位后得到C1和D1,再将C1和D1数据组合后(56位)按照PC2变换的要求变换得到48位的子密钥K1,在进行第1轮迭代时使用K1;同理,将C1和D1左移1位得到C2和D2,再将C2和D2数据组合后按照PC2变换的要求变换得到48位的子密钥K2;……;依此类推,就可以得到K3、K4…..K16。
PC2变换如表6.4所示。
PC2变换是将输入的56位数据变换为48位输出,该变换是一种压缩变换。
根据不同轮数分别进行左移和压缩变换,分别得到16个48位的子密钥K1,K2,…,K16。
③乘积变换
初始置换后的数据分为各32位的两部分,左部分为L0,右部分为R0,这样,L0=D58D50D12….D8,R0=D57D49D41…D7。
乘积变换过程就是将L0和R0按照乘积变换运算公式进行迭代运算,最后得出L16和R16。
如图6.4所示。
第1步:
E变换。
E变换是一个扩展变换,其过程是将32位的数据Ri-1变换成48位,变换规则如表6.5所示。
第2步:
异或变换。
将E变换输出的48位数据与48位的子密钥Ki进行异或运算,得到48位的S盒数据。
第3步:
S盒变换。
将48位的S盒数据均分为8部分,每部分为6位,用8个S盒S1~S8表示。
每个S盒的输入为6位,变换后输出为4位,即经过8个S盒S1~S8变换后输出为32位,如图6.5所示。
S盒的变换规则:
以S1盒为例,将6位输入数据(a1a2a3a4a5a6)的中间4位(a2a3a4a5)对应的数值作为列,两端的2位(a1a6)对应的数值作为行,找到如表6.6所示的S1转换表中相应的位,得到的数值再转换成二进制形式的4位数据,此即为S1盒的输出。
第4步:
P变换。
P变换的过程是将S盒输出的32位数据进行位置变换得到一个新的32数据组,因此P变换为线性变换,其变换规则如表6.14所示。
第5步:
异或变换。
P变换输出的32位数据与32位的Li-1异或后输出32位数据,此数据就是Ri。
当i≤15时,Ri与Li各32位数据将被用来进行下一轮迭代变换。
④逆初始置换(IP-1)
将第16轮迭代变换的输出R16与L16组合在一起构成64位数据组,作为逆初始置换(IP-1)的输入。
逆初始置换的变换规则如表6.15所示,置换完成后的数据即为64位密文。
(3)DES算法的解密过程
DES的解密算法与加密算法相同,解密密钥也与加密密钥相同,区别仅在于进行16轮迭代运算时使用的子密钥顺序与加密时是相反的,即第1轮用子密钥K16、第2轮用K15、…,最后一轮用子密钥K1。
(4)DES算法的安全性
DES是世界上使用最为广泛和流行的一种分组密码算法,被公认为世界上第一个实用的密码算法标准。
DES的缺点是密钥位数太短(56位),而且算法是对称的,使得这些密钥中还存在一些弱密钥和半弱密钥,因此容易被采用穷尽密钥方法解密
由于DES算法完全公开,其安全性完全依赖于对密钥的保护,必须有可靠的信道来分发密钥。
三、DES对称加密算法的实现
1、C语言实现DES对称加密算法过程分析
(1)初始置换
//根据表格改变顺序
voidChangeOrder(bit*origbin,bit*newbin,int*table,intnum)
{
inti;
bittemp[64];
for(i=0;i { temp[i]=origbin[table[i]-1]; } CopyBin(temp,newbin,num); } (2)子密钥生成 voidSetKeys(bit*origkey,bitkeys[][48]) { inti; bitkey64[64],key48[48],key56[56],lkey[28],rkey[28]; CopyBin(origkey,key64,64); ChangeOrder(key64,key56,PC1,56); //printf("PC1变换后的key: \n");PrintBin(key56,56,7); for(i=0;i<16;i++) { //PrintBin(key56,56,14); SplitData(key56,lkey,rkey,56); LoopMove(lkey,MOVE[i]); LoopMove(rkey,MOVE[i]); //printf("C%d: \n",i);PrintBin(lkey,28,7); //printf("D%d: \n",i);PrintBin(rkey,28,7); MergeData(key56,lkey,rkey,56); //printf("C%dD%d: \n",i,i);PrintBin(key56,56,14); ChangeOrder(key56,key48,PC2,48); CopyBin(key48,keys[i],48); //printf("%d个密钥: \n",i+1);PrintBin(keys[i],48,12); } } (3)异或运算 voidXor(bit*date1,bit*data2,intnum) { inti; for(i=0;i { data2[i]^=date1[i]; } } (4)密钥左移及S盒变换 voidLoopMove(bit*key,intnum) { bittemp[28]; CopyBin(&key[num],temp,28-num); CopyBin(key,&temp[28-num],num); CopyBin(temp,key,28); } voidSChange(bit*data48,bit*data32) { inti; bitr[2],c[4]; charer,ec; for(i=0;i<8;i++) { intj=i*6; CopyBin(&data48[j],r,1); CopyBin(&data48[j+5],&r[1],1); CopyBin(&data48[j+1],c,4); BinToDec(r,&er,2); BinToDec(c,&ec,4); DecToBin(S[i][er][ec],&data32[i*4],4); } } (5)DES对称加密算法加密解密 //DES加密、解密 voidDES(char*mykey,char*origdata,char*newdata,inttype) { intlen,i,j; bitdata[64];//保存二进制的数据 bitkey[64];//保存二进制密钥 bitkeys[16][48];//保持子密钥 StrToBin(mykey,key,64); //printf("初始密码: \n");PrintBin(key,64,8); SetKeys(key,keys); len=strlen(origdata); for(i=0,j=len;j>=8;i++,j-=8) { StrToBin(&origdata[i*8],data,64); DESBlock(keys,data,type); BinToDec(data,&newdata[i*8],64); } //不满8字节用0填充 if(j) { memset(data,0,64); StrToBin(&origdata[i*8],data,j*8); DESBlock(keys,data,type); BinToDec(data,&newdata[i*8],64); } memset(&newdata[len%8==0? len: (len+8-len%8)],0,1); } (4)运行截图 加密 解密 2、手工计算DES对称加密算法过程分析 明文: 1107300420林志祥 密钥: 19920324 (1)初始置换(IP) 原数据: 丨1011001111000010丨 丨1101111011001000丨 丨1101010111110010丨 丨0011000100110001丨 IP置换后的数据: 丨0011111011110101丨 丨0001010011010001丨 丨0011111111100001丨 丨0000110000100111丨 (2)子密钥生成 1)根据PC1变换 原密钥: 丨0011000100110010丨 丨0011001100110100丨 丨0011010100110110丨 丨0011011100111000丨 PC1变换后的密钥: 丨00000000000000丨 丨00111111111111丨 丨01100110011110丨 丨00100000001111丨 2)PC2变换和子密钥生成 C1和D1: 丨0000000丨丨1100110丨 丨0000000丨丨0111100丨 丨0111111丨丨0100000丨 丨1111110丨丨0011110丨 K1: 丨010100000010丨 丨110010101100丨 丨010101110010丨 丨101011000010丨 C2和D2: 丨0000000丨丨1001100丨 丨0000000丨丨1111000丨 丨1111111丨丨1000000丨 丨1111100丨丨0111101丨 K15: 丨000110010010丨 丨110010001100丨 丨101001010000丨 丨001100110111丨 C16和D16: 丨0000000丨丨0110011丨 丨0000000丨丨0011110丨 丨0011111丨丨0010000丨 丨1111111丨丨0001111丨 K16: 丨010100010010丨 丨110010001100丨 丨101001110100丨 丨001111000000丨 (3)乘积变换 1)E变换 L0和R0: 丨00111110丨丨00111111丨 丨11110101丨丨11100001丨 丨00010100丨丨00001100丨 丨11010001丨丨00100111丨 E变换后的右半部分数据和密钥K1: 丨100111111111丨丨010100000010丨 丨111100000010丨丨110010101100丨 丨100001011000丨丨010101110010丨 丨000100001110丨丨101011000010丨 2)异或变换1及S盒变换 两者进行异或运算得: 丨110011111101丨 丨001110101110丨 丨110100101010丨 丨101111001100丨 S盒获得的数值: 1114513128711 S盒变换后的右半部分数据: 丨10111110丨 丨01011101丨 丨11001000丨 丨01111011丨 3)P变换 P变换后的右半部分数据和左半部分的数据: 丨11011111丨丨00111110丨 丨10011111丨丨11110101丨 丨00011110丨丨00010100丨 丨01010010丨丨11010001丨 4)异或变换2 两者异或运算得: 丨11100001丨 丨01101010丨 丨00001010丨 丨10000011丨 L1和R1: 丨00111111丨丨11100001丨 丨11100001丨丨01101010丨 丨00001100丨丨00001010丨 丨00100111丨丨10000011丨 两者异或运算得: 丨11001001丨 丨10000000丨 丨10010101丨 丨01101110丨 L16和R16: 丨11011111丨丨11001001丨 丨11101011丨丨10000000丨 丨10100100丨丨10010101丨 丨11100100丨丨01101110丨 乘积变换后的数据: 丨1100100110000000丨 丨1001010101101110丨 丨1101111111101011丨 丨1010010011100100丨 (4)初始置换 逆初始置换表后的数据: 丨1110010010100001丨 丨1000111111100001丨 丨1000010000101011丨 丨1110001111111110丨 DES对称加密算法解密算法与加密算法相同,同上可解密。 三、总结 DES算法是明文分组为64位,有效密钥56位,输出密文64位的,具有16轮迭代的分组对称密码算法。 通过学习此算法,了解到了许多函数,其中有密钥生成函数,加密函数,解密函数,测试函数以及密钥长度检验函数等。 四、源代码 附: #include #include #include #include"table.h" #definebitbool #defineMAX_SIZE1000 #defineENCRYPT0 #defineDECODE1 voidStrToBin(char*str,bit*bin,intnum) { inti; for(i=0;i { bin[i]=(str[i/8]>>(7-i%8))&1; } } voidDecToBin(intdec,bit*bin,intnum) { inti; for(i=0;num>0;i++,num--) { bin[i]=dec>>(num-1)&1; } } voidBinToDec(bit*bin,char*dec,intnum) { intcount,res,i; for(count=0;num>0;count++,num-=8) { dec[count]=0; res=num<8? num: 8; for(i=res;i>0;i--) { dec[count]|=bin[count*8+res-i]<<(i-1); } } } voidCopyBin(bit*origbin,bit*newbin,intnum) { inti; for(i=0;i { newbin[i]=origbin[i]; } } voidPrintBin(bit*bin,intnum,intcount) { inti; for(i=0;i { if(i%count==0)printf("丨"); printf("%-2d",bin[i]); if((i+1)%count==0)printf("丨\n"); } printf("\n"); } voidPrintInfo(intnum,bit*ldata,bit*rdata,bit*subkey) { inti,j; printf("L%d: \t\t\tR%d: \t\t\tK%d: \n",num,num,num); for(i=0;i<4;i++) { printf("丨"); for(j=0;j<8;j++) { printf("%-2d",ldata[i*8+j]); } printf("丨\t丨"); for(j=0;j<8;j++) { printf("%-2d",rdata[i*8+j]); } printf("丨\t丨"); for(j=0;j<12;j++) { printf("%-2d",subkey[i*12+j]); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 源代码 分析 课程设计 报告