DES算法的matlab实现
来源:互联网 发布:网络音乐最新排行榜 编辑:程序博客网 时间:2024/05/18 04:09
DES算法流程图(图片来源:www.baidu.com)
%DES算法Matlab代码 function C=DES(D,K,M) % 输入16进制数表示的字符串格式明文D和密钥K,M=1表示加密 %% ----------------------------------数据初始化----------------------------------- %将以字符串形式输入的明文和密钥转换成01数字串 DB=[]; for i=1:16 Di=D(i); DBi=['0000',dec2bin(hex2dec(Di))]; DBi=DBi(end-3:end); DBi=[str2num(DBi(1)),str2num(DBi(2)),str2num(DBi(3)),str2num(DBi(4))]; DB=[DB,DBi]; endD=DB; 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]; endK=KB; %64位数据IP置换表 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]; IP0=reshape(IP',1,64);%转换成行向量 D_IP=D(IP0);%对D初始置换 %E盒为数据扩展 E=[32, 1, 2, 3, 4, 5; 4, 5, 6, 7, 8, 9; 8, 9,10,11,12,13; 12,13,14,15,16,17; 16,17,18,19,20,21; 20,21,22,23,24,25; 24,25,26,27,28,29; 28,29,30,31,32,1]; S1=[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7; 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8; 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0; 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]; S2=[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10; 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5; 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15; 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]; S3=[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8; 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1; 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7; 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]; S4=[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15; 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9; 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4; 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]; S5=[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9; 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6; 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14; 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]; S6=[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11; 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8; 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6; 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]; S7=[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1; 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6; 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2; 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12];S8=[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7; 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2; 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8; 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]; %P盒置换 P=[16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25]; PC1=[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]; 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); K_PC1=K(PC1);%经过密钥初始置换 C0=K_PC1(1:28);%分为两部分 D0=K_PC1(29:56); for i=1:16 if i==1||i==2||i==9||i==16%第1、2、9、16轮循环左移1位 C0=[C0(2:end),C0(1)]; D0=[D0(2:end),D0(1)]; else%其它轮循环左移2位 C0=[C0(3:end),C0(1:2)]; D0=[D0(3:end),D0(1:2)]; end K_LS=[C0,D0]; Ki(i,:)=K_LS(PC2); end%% ---------------------------16轮循环加密--------------------------------- L=D_IP(1:32);%输入的左半部分明文 R=D_IP(33:64);%输入的右半部分明文 for i=1:16 E0=reshape(E',1,48);%把E盒转换成行向量 R_E=R(E0); %E盒扩展 %与子密钥相加 if M==1 %选择加密与解密,M=1表示加密 R_Ki=mod(R_E+Ki(i,:),2); else R_Ki=mod(R_E+Ki(17-i,:),2); end %经S1盒 B=R_Ki(1:6); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S1(x,y))]; C=C(end-3:end); C1=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S2盒 B=R_Ki(7:12); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S2(x,y))]; C=C(end-3:end); C2=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S3盒 B=R_Ki(13:18); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S3(x,y))]; C=C(end-3:end); C3=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S4盒 B=R_Ki(19:24); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S4(x,y))]; C=C(end-3:end); C4=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S5盒 B=R_Ki(25:30); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S5(x,y))]; C=C(end-3:end); C5=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S6盒 B=R_Ki(31:36); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S6(x,y))]; C=C(end-3:end); C6=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S7盒 B=R_Ki(37:42); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S7(x,y))]; C=C(end-3:end); C7=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; %经S8盒 B=R_Ki(43:48); x=B(1)*2+B(6)+1; y=B(2)*8+B(3)*4+B(4)*2+B(5)+1; C=['0000',dec2bin(S8(x,y))]; C=C(end-3:end); C8=[str2num(C(1)),str2num(C(2)),str2num(C(3)),str2num(C(4))]; C=[C1,C2,C3,C4,C5,C6,C7,C8];%经过8个S盒的结果合并 R_P=C(P);%P盒置换 %交换左右两半部分 TEMP=L; L=R; R=mod(TEMP+R_P,2); end%交换左右两半部分 TEMP=L; L=R; R=TEMP; %输出密文 C=[L,R]; %% -------------------------------逆初始置换------------------------------ 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_10=reshape(IP_1',1,64); C=C(IP_10); CS=[]; C=num2str(C); pos= C~=' ';%pos=find(C~=' ');C=C(pos); for i=1:4:61 Ci=C(i:i+3); CS=[CS,num2str(dec2hex(bin2dec(Ci)))]; endC=CS;
代码涉及的函数介绍:
1、函数:reshape()
使用格式:B = reshape(A,m,n)返回一个m*n的矩阵B, B中元素是按列从A中得到的。如果A中元素个数没有m*n个, 则会引发错误。
源代码出处:IP0=reshape(IP’,1,64);%转换成行向量,1行64列;
注意B中元素是按列从A中得到的,所以一定要将IP矩阵转置,即IP’。
2、函数:hex2dec()
使用格式:A=hex2dec(‘1111’);%将16进制字符串’1111’转换成10进制的double型数A,在这里A=4369。
3、函数:dec2bin()
使用格式:A=dec2bin(23);%将double型10进制数23转换成一个二进制的字符串,在这里A=’10111’;
4、函数:str2num()
使用格式:A=sttr2num(‘123’);%将字符串’123’转换成一个double型的数A,A=123;
5、函数:mod()
使用格式:A=mod(9,2);%9取2的模,此处A=1;在代码中,用来做异或处理,因为两个01数字串异或等价于两者做模二加法,也就是说a异或b等价于a和b做模二加法,即mod(a+b,2);
6、函数num2str();dec2hex();bin2dec()
使用格式:与上面介绍的函数效果是相反,在此不赘诉;
7、其他
A=zeros(1,2);%创建1行2列的全0矩阵
A=A(2:end);%截取矩阵A的
——————————————————-**
以上代码函数的调用格式举例:
加密:
D=’1234567887654321’;K=’1234567887654321’;M=1;C=DES(D,K,M);
结果截图:
解密:
D=’875202EBECC37679’;K=’1234567887654321’;M=0;C=DES(D,K,M);
结果截图:
- DES算法的matlab实现
- DES算法的实现
- Des算法的实现
- DES算法的实现
- S-DES算法的实现
- des算法的java实现!
- Java 的DES算法实现
- Java的DES算法实现
- DES算法的C#实现
- DES算法的Java实现
- DES算法的介绍和实现
- DES算法的介绍和实现
- DES加密与解密算法的实现
- DES算法的介绍以及实现
- DES算法的介绍和实现
- simple-des算法的java实现
- 求des算法的c语言实现
- DES算法的C实现代码
- 3.24任务
- spark mllib 应用程序开发及提交到spark集群运行--入门
- 回顾Java中被遗忘的细节(五)
- Git在项目协同开发中的简单使用
- 使用详解及源码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
- DES算法的matlab实现
- 求四个数的最大公约数
- c++中的基础概念
- 获取Windows操作系统版本
- 微信网页版协议的java封装
- 倒计时时钟
- 高性能JAVASCRIPT
- 你如何对网站的文件和资源进行优化?
- JS操作SVG模拟水滴分离、融合效果