基于Matlab的DES算法Word文件下载.docx
《基于Matlab的DES算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于Matlab的DES算法Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
a)算法实现方案
Matlab(矩阵实验室)是一款工程计算用的软件,功能十分强大。
Matlab的计算基于矩阵,而DES算法用矩阵描述是十分简洁方便的。
因此,选用Matlab作为算法实现语言,基于一系列的矩阵变换、运算来实现DES算法的加密。
b)主要功能实现流程及代码解析
1)加密程序
图1DES基本结构
DES算法的结构非常简单,是一个16次的迭代。
核心是函数中一系列变换。
根据算法框图,程序步骤主要分为三大部分:
1)输入明文和密钥进行字符转换
2)产生16轮密钥矩阵
3)16轮迭代
%%demo5.m
clc,clearall;
%%
%----------第一步输入明文和密钥-------------%
M='
0123456789ABCDEF'
;
%
K='
%
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=[];
Ki=K(i);
KBi=['
dec2bin(hex2dec(Ki))];
KBi=KBi(end-3:
KBi=[str2num(KBi
(1)),str2num(KBi
(2)),str2num(KBi(3)),str2num(KBi(4))];
KB=[KB,KBi];
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,:
%后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:
Ki(i,:
)=KEY_MAT(i,PC_2);
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轮迭代>
[L,R]=fchange(L,R,i,KEY);
mi=[L,R];
mi2_hex(i,:
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=['
dec2bin(f2)];
%%字符串处理
f2_bin=f2_bin(end-3:
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;
%交换位置
程序见demo5.m。
2)解密程序
DES算法设计巧妙也体现在其解密过程非常简单,结构和加密算法完全一样,只需要将16轮加密所用的密钥完全倒过来。
对密钥矩阵16X64的行倒序排列,得到倒过来后的密钥矩阵。
其余部分与解密程序
保持一致即可。
解密时,输入密文和密钥,得到明文。
程序见demo5_inv.m。
c)加密64比特明文,对密文进行解密得到明文,观察是否与初始明文一致
加密。
这里用Matlab中的GUI界面编写了加解密的交互程序。
交互程序见desecb.m。
在程序demo5.m中输入64比特明文及64比特密钥:
运行:
m_hex=56CC09E7CFDC4CEF
图2DES_demoGUI界面
解密:
在程序demo5_inv.m中输入64比特密文及64比特密钥:
56CC09E7CFDC4CEF'
m_hex=0123456789ABCDEF
将密文解密后与初始明文一致。
为了证明程序对DES算法的正确实现,用密码学习软件Cryptool进行了验证。
加密结果与本程序一致。
图3CrypTool加密结果
3.2DES弱密钥验证
a)用选定的弱密钥进行两次加密,观察得到的结果
用已知四个弱密钥中的一个’FFFFFFFFFFFFFFFF’,对'
进行加
密:
FFFFFFFFFFFFFFFF'
m_hex=6DCE0DC9006556A3
再次加密:
6DCE0DC9006556A3'
m_hex=0123456789ABCDEF
可以看出,两次加密后密文和第一次的初始明文一样,相当于是加密后再解密。
验证了弱密钥。
b)用选定的非弱密钥进行两次加密,观察得到的结果
用已知四个半弱密钥中的一个‘01FE01FE01FE01FE’和对'
进行加密:
M='
K='
01FE01FE01FE01FE'
m_hex=8A76C7A4F16D47ED
再用与‘01FE01FE01FE01FE’对应的半弱密钥FE01FE01FE01FE01FE01’加密:
8A76C7A4F16D47ED'
FE01FE01FE