基于利用Matlab语言实现DES加密算法毕业设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

密码学与网络安全课程实验
利用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)加密程序
图1 DES基本结构
DES算法的结构非常简单,是一个16次的迭代。

核心是f函数中一系列变换。

根据算法框图,程序步骤主要分为三大部分:
1)输入明文和密钥进行字符转换
2)产生16轮密钥矩阵
3)16轮迭代
%%demo5.m
clc, clear all;
%%
%----------第一步输入明文和密钥-------------%
M='0123456789ABCDEF';%
K='0123456789ABCDEF';%
MB=[];
for i=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=[];
for i=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,1 9,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);%初始矩阵变换 64 to 56
%循环移位>>>>>
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
for i=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,3 6,29,32];
for i=1:16
Ki(i,:)=KEY_MAT(i,PC_2);
end
KEY=Ki;
%%
%----------第四步 Feistel结构-------------%
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];
%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轮迭代>
for i=2:16
[L,R]=fchange(L,R,i,KEY);
mi=[L,R];
mi2_hex(i,:)=mi
end
IP_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];
%%IP_1初始逆置换矩阵
m16=[R,L];%最后一步进行交换
C=m16(IP_1); %IP逆置换
[m_hex]=m_2_hex(C)%转化为16进制输出密文%%
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扩展 OK
Ri_1_ex2=reshape(Ri_1_ex',1,48);%将扩展的48位变为向量 OK
f=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)),str2 num(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
程序见c:\iknow\docshare\data\cur_work\demo5.m。

2)解密程序
DES算法设计巧妙也体现在其解密过程非常简单,结构和加密算法完全一样,只需要将16轮加密所用的密钥完全倒过来。

对密钥矩阵16X64的行倒序排列,得到倒过来后的密钥矩阵。

其余部分与解密程序保持一致即可。

解密时,输入密文和密钥,得到明文。

程序见c:\iknow\docshare\data\cur_work\demo5_inv.m。

c)加密64比特明文,对密文进行解密得到明文,观察是否与初始明文一致
加密。

这里用Matlab 中的GUI界面编写了加解密的交互程序。

交互程序见。

在程序demo5.m中输入64比特明文及64比特密钥:
M='0123456789ABCDEF';
K='0123456789ABCDEF';
运行:
m_hex = 56CC09E7CFDC4CEF
图2 DES_demo GUI界面
解密:
在程序demo5_inv.m中输入64比特密文及64比特密钥:
M='56CC09E7CFDC4CEF';
K='0123456789ABCDEF';
运行:
m_hex =0123456789ABCDEF
将密文解密后与初始明文一致。

为了证明程序对DES算法的正确实现,用密码学习软件Cryptool进行了验证。

加密结果与本程序一致。

图3 CrypTool加密结果
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)对任意长(m bit)明文分成N组,每组64bit
2)初始向量IV与第一组明文异或
3)第i-1组密文与第i组明文异或作为DES的输入明文
4)迭代N-1次
5)得到N*64bit密文,截取为m bit
算法框图为:
图4 DES_CBC模式基本结构
程序编写主要实现对任意长明文分组,以及对DES外围结构的改变。

主要代码如下:
M='0123456789ABCDEF0123456789ABCD0123456789ABCDEF0123456789ABCD';
% 任意长明文
K='0123456789ABCDEF';%密钥
IV='11223344AABBCCDD'; %初始向量
%*****明文分组»»
a=ceil(length(M)/16); %向上取整
MB=M;
for i=1:16*a-length(M)
MB=[MB '0'];
end
Mi=[];
for j=1:a
Mi(j,:)=MB((16*j-15):16*j);
end
M=bitxor(M,IV); %算法核心是先按位异或再输入DES
程序见c:\iknow\docshare\data\cur_work\mydes.m,demo5_CBC.m。

运行,得密文:
C_CBC =
21BC605D513B38E8D8EF6671D93179070D7E6266C1FA5A5210099C143D26
与明文等长(60*4bit)。

b)分析你所设计的这种方法有什么优点和/或缺点
CBC算法的优点很明显能有效地避免ECB对明文统计特征的泄漏,因为同一明文块输入DES中的实际明文是不一样的。

CBC算法的缺点也是很明显的,由于其算法结构的限制,CBC不能实现并行运
算,且误差传递效应比ECB差,一个密文块损坏,会引起两个明文块损坏。

3.4DES弥散特性分析
a)选择任意64比特明文m,选择任意56比特密钥k进行加密,并输出每一轮
加密的64比特序列
选定明文和密钥,依次输出每一轮加密输出的密文:
明文:M='0123456789ABCDEF';
密钥:K='0123456789ABCDEF';
每一轮的加密结果如下表所示:
表1 16轮加密结果
b)随机改变m中的一个比特,用上述密钥k进行加密,并输出每一轮加密的64
比特序列,与上一步的结果进行比较,你发现了什么?
将明文:M='0123456789ABCDEF'中第四位二进制改为1,则明文变为:M='1123456789ABCDEF',用相同的密钥加密,用红字标注出前6轮密文中与之前对应相等的位数,结果为:
表3 明文改变1bit后的16轮加密结果
首先定性的可以明显看出: 第一轮密文有1bit 不相等:
1616→(C )(D ) 即2211001101→()()
第二轮密文有7bit 不相等:
1616→(C )(D ) 即2211001101→()()
16168→()(A ) 即
2210001010→()() 161623→()() 即2200100011→()() 161615→()() 即2200010101→()() 161632→()() 即2200110010→()() 161648→()() 即2201001000→()()
为了说明弥散特性,对改变后的16轮密文与之前产生密文进行定量分析(相 等位数检查程序见bitcheck.m ):
表4 明文改变1bit 前后的16轮加密结果中相等比特位数
由上表可以看出,随着轮数增加,初始明文1bit 的改变对于密文的弥散效应越 好。

理论上,任意两个64位二进制序列相等时在相等位数为32时概率最大(每一位取0,1是等概率的), 因此在第四轮之后可认为弥散效应已经使得两组64位二进制序列不具有相关性。

这些结论充分说明,1bit 明文的改变对于密文的改变影响是很大的。

c) 对明文m ,随机改变k 的一个比特,并以此进行加密,同样输出每一轮的64
比特序列,与第一步中的结果进行比较,你发现了什么?
将密钥:k='0123456789ABCDEF'中第四位二进制数改为1, 则密钥为: k='1123456789ABCDEF', 输入相同的明文,用红字标注出前2轮密文中与之前对应相等的位数,结果为:
表5 密钥改变1bit后的16轮加密结果
同样进行弥散特性的定量分析:
表6 密钥改变1bit前后的16轮加密结果中相等比特位数
与a)和b)中结果比较,1bit密钥的改变对于密文的改变影响同样是很大的。

相关文档
最新文档