www.pudn.com > 11DES_encryption.rar > DES.m


% function C=DES(M,K) 
%% --------------------------------------------------------------- 
%  数据加密标准DES算法的Matlab实现 
%  输入明文M和密钥K用16进制数表示,字符串格式 
%-------------------------------------------------------------------------- 
%% ---------------第一步:数据初始化-------------------------------- 
%以字符串形式输入的明文和密钥转换成01数字串 
%明文和密钥 
clear 
clc 
% M为16进制初始值,即64位明文组 
M = 'AF33333333555325';  
% K为64为密文组 
K = '1111111111111111'; 
% 分配存储空间 
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))]; 
%     MBi = [dec2bin(hex2dec(Mi))]; 
%     MBi = [str2num(MBi)]; 
    MB=[MB,MBi]; 
end 
M=MB; 
 
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; 
% E-盒扩展置换;E = 6*8 =48. 
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]; 
% 8个S-盒查表;Sx = 4*16 = 64 
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 = 1*32 
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 = 1*56 
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 = 1*48 
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初始空间分配 
Ki=zeros(16,48); 
% 压缩变换PC-1 
K_PC1=K(PC1);                       %经过密钥初始置换 
% 分割得到C0,D0 
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]; 
%     压缩变换PC-2,i--->1 to 16,实现16轮迭代运算 
    Ki(i,:)=K_LS(PC2); 
end 
%% -----------------第三步:16轮循环加密---------------------------- 
% 没有做初始换位和逆初始换位处理 
L=M(1:32); %输入的左半部分明文 
R=M(33:64);%输入的右半部分明文 
%以下是16轮迭代 
for i=1:16 
    E0=reshape(E',1,48);    %把E盒转换成行向量 
    R_E=R(E0);              %E盒扩展 
    R_Ki=mod(R_E+Ki(i,:),2);%与子密钥相加 
    %经过S1盒; 
%     每个S-盒有6位输入,4位输出。 
    B=R_Ki(1:6); 
%     2进制转换为10进制,加1是因为矢量索引从1开始。 
    x=B(1)*2+B(6)+1;                % x-->b1b6 
    y=B(2)*8+B(3)*4+B(4)*2+B(5)+1;  % y-->b2b3b4b5 
    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盒的结果合并起来 
    %经过P盒置换 
    R_P=C(P); 
    %交换左右两半部分 
    TEMP=L; 
    L=R; 
    R=mod(TEMP+R_P,2);  % mod(x,2)即将x变换为2进制序列。 
end 
%交换左右两半部分 
TEMP=L; 
L=R; 
R=TEMP; 
%输出密文 
C=[L,R]; 
CS=[]; 
C=num2str(C); 
pos=find(C~=' '); 
C=C(pos); 
for i=1:4:61 
   Ci=C(i:i+3); 
   CS=[CS,num2str(dec2hex(bin2dec(Ci)))]; 
end 
C=CS