function C = encrypt_fcn(m,k,style)
%-----------------------------------------%
% 函数功能: 对明文进行DES加密
% 输入:
% m:用户输入的铭文
% k:DES加密中用到的16个密钥
% style:1为加密,0为解密
% 输出:
% C:加密后的密文
%-----------------------------------------%
% 需要用到的置换表
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_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];
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];
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];
S_Box = {[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], ...
[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], ...
[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], ...
[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], ...
[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], ...
[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], ...
[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], ...
[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]};
% 明文转二进制,并拆分为1*64矩阵
m1_ip = zeros(8);
m_bin = dec2bin(abs(m),8);
num = size(m_bin,1)/8;
if num > floor(num)
num = floor(num)+1;
end
temp1 = num2str(zeros(8*num-size(m_bin,1),8));
temp1(temp1==' ') = [];
temp1 = reshape(temp1,8*num-size(m_bin,1),8);
m_bin = [m_bin;temp1];
for i = 1:num
temp = (i-1)*8;
mm{i} = reshape(m_bin(1+temp:8+temp,1:8)',1,64);
end
% IP置换
for dd = 1:num
% IP置换
for i = 1:64
m_ip(i) = str2num(mm{dd}(IP(i)));
end
m_ip = reshape(m_ip,1,64);
% 拆分成L和R
L = m_ip(1:32);
R = m_ip(33:64);
R_E = zeros(1,48);
% 加密是k顺序,解密时逆序
if style == 1
count = 1:16;
elseif style == 0
count = 16:-1:1;
end
% 16轮加密
for i = count
R_temp = R;
% E置换
for ii = 1:48
R_E(ii) = R(E(ii));
end
% 与秘钥异或
S = xor(R_E,k{i});
S = reshape(S,6,8)';
S_output = [];
% S盒
for iii = 1:8
% 计算盒子中的行列索引
c = 1;
for j = 2:5
c = c + S(iii,j)*2^(5-j);
end
r = S(iii,1)*2 + S(iii,6) + 1;
S_output = [S_output;dec2bin(S_Box{iii}(r,c),4)];
end
S_P = zeros(1,32);
S_output = S_output';
% P置换
for jj = 1:32
S_P(jj) = str2num(S_output(P(jj)));
end
% S盒结果与L异或得到R
S_P = fliplr(reshape(S_P,4,8));
R = xor(S_P,reshape(L,8,4)');
R = reshape(R',1,32);
% RL左右交换
L = R_temp;
end
R = reshape(R,8,4)';
L = reshape(L,8,4)';
% 16轮后的输出
C_result = [R;L];
% IP-1置换
C{dd} = zeros(8);
C_result = C_result';
for i = 1:64
C{dd}(i) = C_result(IP_1(i));
end
% 将密文数字转字符
C{dd} = C{dd}';
C{dd} = num2str(C{dd});
C{dd}(C{dd}==' ') = [];
C{dd} = reshape(C{dd},8,8);
C{dd} = bin2dec(C{dd});
C{dd} = char(C{dd});
C{dd} = reshape(C{dd},1,8);
end
% 将密文字符合成一个完整字符串
n = 1:length(C);
C = [C{n}];
end
评论1