基于Matlab的DES算法.docx
《基于Matlab的DES算法.docx》由会员分享,可在线阅读,更多相关《基于Matlab的DES算法.docx(11页珍藏版)》请在冰豆网上搜索。
密码学与网络安全课程实验
利用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基本结构
DES算法的结构非常简单,是一个16次的迭代。
核心是函数中一系列变换。
根据算法框图,程序步骤主要分为三大部分:
1)输入明文和密钥进行字符转换
2)产生16轮密钥矩阵
3)16轮迭代
%%demo5.m
clc,clearall;
%%
%----------第一步输入明文和密钥-------------%
M='0123456789ABCDEF';%
K='0123456789ABCDEF';%
MB=[];
fori=1:
16
Mi=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];
end
M=MB;%转化为64位二进制明文
KB=[];
fori=1:
16
Ki=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];
end
K=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);%C0
D(1,:
)=KEY0(29:
56);%D0
fori=2:
17
C(i,:
)=circshift(C(i-1,:
)',shift_array(i-1))';%前28位循环移位%circshift是右移移动负数位表示左移
D(i,:
)=circshift(D(i-1,:
)',shift_array(i-1))';%后28位循环移位
end
PC2=[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*56
KEY_MAT=KEY_MAT(2:
17,:
);%16*56
PC_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:
16
Ki(i,:
)=KEY_MAT(i,PC_2);
end
KEY=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,:
)=mi
end
IP_1=[40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725];
%%IP_1初始逆置换矩阵
m16=[R,L];%最后一步进行交换
C=m16(IP_1);%IP逆置换
[m_hex]=m_2_hex(C)%转化为16进制输出密文%%
%%fchange.m
function[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);%转化为向量并置换运算P
Ri=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='FE01FE01FE