?? des.m
字號:
% function C=DES(M,K)
%% ---------------------------------------------------------------
% 數(shù)據(jù)加密標(biāo)準(zhǔn)DES算法的Matlab實(shí)現(xiàn)
% 輸入明文M和密鑰K用16進(jìn)制數(shù)表示,字符串格式
%--------------------------------------------------------------------------
%% ---------------第一步:數(shù)據(jù)初始化--------------------------------
%以字符串形式輸入的明文和密鑰轉(zhuǎn)換成01數(shù)字串
%明文和密鑰
clear
clc
% M為16進(jìn)制初始值,即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-盒擴(kuò)展置換;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];
%% -----------------第二步:產(chǎn)生子密鑰------------------------------
% Ki初始空間分配
Ki=zeros(16,48);
% 壓縮變換PC-1
K_PC1=K(PC1); %經(jīng)過密鑰初始置換
% 分割得到C0,D0
C0=K_PC1(1:28);
D0=K_PC1(29:56);
% 移位的實(shí)現(xiàn)
for i=1:16
if i==1||i==2||i==9||i==16 %第1、2、9、16輪循環(huán)左移1位
C0=[C0(2:end),C0(1)];
D0=[D0(2:end),D0(1)];
else %其它輪循環(huán)左移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,實(shí)現(xiàn)16輪迭代運(yùn)算
Ki(i,:)=K_LS(PC2);
end
%% -----------------第三步:16輪循環(huán)加密----------------------------
% 沒有做初始換位和逆初始換位處理
L=M(1:32); %輸入的左半部分明文
R=M(33:64);%輸入的右半部分明文
%以下是16輪迭代
for i=1:16
E0=reshape(E',1,48); %把E盒轉(zhuǎn)換成行向量
R_E=R(E0); %E盒擴(kuò)展
R_Ki=mod(R_E+Ki(i,:),2);%與子密鑰相加
%經(jīng)過S1盒;
% 每個S-盒有6位輸入,4位輸出。
B=R_Ki(1:6);
% 2進(jìn)制轉(zhuǎn)換為10進(jìn)制,加1是因?yàn)槭噶克饕龔?開始。
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))];
%經(jīng)過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))];
%經(jīng)過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))];
%經(jīng)過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))];
%經(jīng)過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))];
%經(jīng)過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))];
%經(jīng)過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))];
%經(jīng)過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];%經(jīng)過8個S盒的結(jié)果合并起來
%經(jīng)過P盒置換
R_P=C(P);
%交換左右兩半部分
TEMP=L;
L=R;
R=mod(TEMP+R_P,2); % mod(x,2)即將x變換為2進(jìn)制序列。
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -