密码学与网络安全课程实验利用Matlab语言实现DES加密算法姓名:ZA学号:XXXXX一、实验目的1)牢固掌握DES密码算法2)通过编程实现DES算法,深入掌握现代密码算法实现的基本方法3)验证DES算法中各个模块在实现混淆和弥散中的作用二、实验内容要求1)DES算法实现:利用Matlab语言实现DES密码算法,输入64比特明文和56比特密钥,加密得到64比特的密文;2)DES弱密钥验证:观察弱密钥两次加密的结果,与非弱密钥两次加密的结果进行比较;3)DES算法初步应用:尝试加密一个字符串,字符串的长度大于8个字节;4)DES弥散特性分析:试输出每一轮加密得到的比特序列,并比较当初始明文1个比特发生变化时,每一轮加密输出的哪些比特发生变化。三、实验方案与步骤3.1DES算法实现a)算法实现方案Matlab(矩阵实验室)是一款工程计算用的软件,功能十分强大。Matlab的计算基于矩阵,而DES算法用矩阵描述是十分简洁方便的。因此,选用Matlab作为算法实现语言,基于一系列的矩阵变换、运算来实现DES算法的加密。b)主要功能实现流程及代码解析1)加密程序图1DES基本结构+F第1轮L1R1+F第i轮LiRi+F第n轮LnRnK1KiKn明文(2W比特)W比特W比特L0R0密文(2W比特)选择扩展运算E+选择压缩运算S置换运算P+LiRiRi-1Li-1Ki48324832483232DES算法的结构非常简单,是一个16次的迭代。核心是f函数中一系列变换。根据算法框图,程序步骤主要分为三大部分:1)输入明文和密钥进行字符转换2)产生16轮密钥矩阵3)16轮迭代%%demo5.mclc,clearall;%%%----------第一步输入明文和密钥-------------%M='0123456789ABCDEF';%K='0123456789ABCDEF';%MB=[];fori=1:16Mi=M(i);MBi=['0000',dec2bin(hex2dec(Mi))];MBi=MBi(end-3:end);MBi=[str2num(MBi(1)),str2num(MBi(2)),str2num(MBi(3)),str2num(MBi(4))];MB=[MB,MBi];endM=MB;%转化为64位二进制明文KB=[];fori=1:16Ki=K(i);KBi=['0000',dec2bin(hex2dec(Ki))];KBi=KBi(end-3:end);KBi=[str2num(KBi(1)),str2num(KBi(2)),str2num(KBi(3)),str2num(KBi(4))];KB=[KB,KBi];endK=KB;%转化为64位二进制密钥%%%----------第三步产生密钥-------------%PC_1=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4];%PC_1置换矩阵56位KEY0=K(PC_1);%初始矩阵变换64to56%循环移位shift_array=-[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1];C(1,:)=KEY0(1:28);%C0D(1,:)=KEY0(29:56);%D0fori=2:17C(i,:)=circshift(C(i-1,:)',shift_array(i-1))';%前28位循环移位%circshift是右移移动负数位表示左移D(i,:)=circshift(D(i-1,:)',shift_array(i-1))';%后28位循环移位endPC2=[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];Ki=zeros(16,48);%循环移位KEY_MAT=[C,D];%17*56KEY_MAT=KEY_MAT(2:17,:);%16*56PC_2=[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];fori=1:16Ki(i,:)=KEY_MAT(i,PC_2);endKEY=Ki;%%%----------第四步Feistel结构-------------%IP=[58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157];%IP初始置换矩阵M=M(IP);%初始置换m0_L=M(1:32);%输入的左半部分明文m0_R=M(33:64);%输入的右半部分明文[L,R]=fchange(m0_L,m0_R,1,KEY);mi=[L,R];mi2_hex(1,:)=mi%%进入16轮迭代fori=2:16[L,R]=fchange(L,R,i,KEY);mi=[L,R];mi2_hex(i,:)=miendIP_1=[40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725];%%IP_1初始逆置换矩阵m16=[R,L];%最后一步进行交换C=m16(IP_1);%IP逆置换[m_hex]=m_2_hex(C)%转化为16进制输出密文%%%%fchange.mfunction[Li,Ri]=fchange(Li_1,Ri_1,m,KEY)%%第i轮f函数的实现输入Ri-1表示第i-1轮的右半部分密文输出第i轮的密文Ri_1_ex=trm32_to_48(Ri_1);%第一步右半明文进行32to48扩展OKRi_1_ex2=reshape(Ri_1_ex',1,48);%将扩展的48位变为向量OKf=bitxor(KEY(m,:),Ri_1_ex2);%与第i轮密钥按位异或f1=reshape(f,6,8)';%变为矩阵8个6位二进制数8*6%经过S1盒s=S_box(1);x=2*f1(1,1)+f1(1,6);%S盒纵坐标y=8*f1(1,2)+4*f1(1,3)+2*f1(1,4)+f1(1,5);%S盒横坐标f2=s(x+1,y+1);%取S盒中某一数f2_bin=['0000',dec2bin(f2)];%%字符串处理f2_bin=f2_bin(end-3:end);f2_1=[str2num(f2_bin(1)),str2num(f2_bin(2)),str2num(f2_bin(3)),str2num(f2_bin(4))];%省略s2~s8盒Ri_1_P=P_exchange(f2S);%转化为向量并置换运算PRi=bitxor(Li_1,Ri_1_P);%Li_1与f函数后的Ri_1进行按位异或Li=Ri_1;%交换位置end程序见demo5.m。2)解密程序DES算法设计巧妙也体现在其解密过程非常简单,结构和加密算法完全一样,只需要将16轮加密所用的密钥完全倒过来。对密钥矩阵16X64的行倒序排列,得到倒过来后的密钥矩阵。其余部分与解密程序保持一致即可。解密时,输入密文和密钥,得到明文。程序见demo5_inv.m。c)加密64比特明文,对密文进行解密得到明文,观察是否与初始明文一致加密。这里用Matlab中的GUI界面编写了加解密的交互程序。交互程序见desecb.m。在程序demo5.m中输入64比特明文及64比特密钥:M='0123456789ABCDEF';K='0123456789ABCDEF';运行:m_hex=56CC09E7CFDC4CEF图2DES_demoGUI界面解密:在程序demo5_inv.m中输入64比特密文及64比特密钥:M='56CC09E7CFDC4CEF';K='0123456789ABCDEF';运行:m_hex=0123456789ABCDEF将密文解密后与初始明文一致。为了证明程序对DES算法的正确实现,用密码学习软件Cryptool进行了验证。加密结果与本程序一致。图3CrypTool加密结果3.2DES弱密钥验证a)用选定的弱密钥进行两次加密,观察得到的结果用已知四个弱密钥中的一个’FFFFFFFFFFFFFFFF’,对'0123456789ABCDEF'进行加密:M='0123456789ABCDEF';K='FFFFFFFFFFFFFFFF';m_hex=6DCE0DC9006556A3再次加密:M='6DCE0DC9006556A3';K='FFFFFFFFFFFFFFFF';m_hex=0123456789ABCDEF可以看出,两次加密后密文和第一次的初始明文一样,相当于是加密后再解密。验证了弱密钥。b)用选定的非弱密钥进行两次加密,观察得到的结果用已知四个半弱密钥中的一个‘01FE01FE01FE01FE’和对'0123456789ABCDEF'进行加密:M='0123456789ABCDEF';K='01FE01FE01FE01FE';m_hex=8A76C7A4F16D47ED再用与‘01FE01FE01FE01FE’对应的半弱密钥FE01FE01FE01FE01FE01’加密:M='8A76C7A4F16D47ED';K='FE01FE01FE01FE01';m_hex=0123456789ABCDEF可以看出,一对半弱密钥能够互相加解密。3.3DES算法初步应用a)任意选定一个长度大于8个字符的字符串,设计一种方法对这个字符串进行加密用电码本模式ECB直接对明文分成以64位一组的块,这里用密文分组链接模式CBC来实现。算法步骤:1)对任意长(mbit)明文分成N组,每组64bit2)初始向量IV与第一组明文异或3)第i-1组密文与第i组明文异或作为DES的输入明文4)迭代N-1次5)得到N*64bit密文,截取为mbit算法框图为:图4DES_CBC模式基本结构程序编写主要实现对任意长明文分组,以及对DES外围结构的改变。主要代码如下:M='0123456789ABCDEF0123456789ABCD0123456789ABCDEF0123456789ABCD';%任意长明文K='0123456789ABCDEF';%密钥IV='11223344AABBCCDD';%初始向量%*****明文分组»»a=ceil(length(M)/16);%向上取整MB=M;fori=1:16*a-length(M)MB=[MB'0'];endMi=[];forj=1:aMi(j,:)=MB((16*j-15):16*j);endM=bitxor(M,IV);%算法核心是先按位异或再输入DES程序见mydes.m,demo5_CBC.m。运行,得密文:C_CBC=21BC605D513B38E8D8EF6671D93179070D7E6266C1FA5A5210099C143D26与明文等长(60*4bit)。b)分析你所设计的这种方法有什么优点和/或缺点CBC算法的优点很明显能有效地避免ECB对明文统计特征的泄漏,因为同一明文块输入DES中的实际明文是不一样的。CBC算