DES算法的matlab实现

image-20220316225126045

主函数

keyword = 'AABBCCDD';   % 密码,8位ascii码
text = 'woleilee';      % 明文8位ascii码
bin_text = convert_mess2bin(text);  
keys = generate_keys(keyword);      % 计算加密密钥
bin_result = DES(bin_text,keys);
result  = convert_bin2mess(bin_result);   % 密文
disp(['加密后的密文为:',result]);
de_keys = flipud(keys);     % 解密密钥
bin_de_result = DES(bin_result,de_keys);  % 解密后的二进制
de_result = convert_bin2mess(bin_de_result);    % 解密
disp(['解密后的密文为:',de_result]);
if strcmp(text,de_result)==1
    disp('DES加密后解密成功!');
else
    disp('DES加密后解密失败!');
end

接下来几个是函数

DES.m

%%该代码仅仅用于信息网络安全技术的学习%%

function [ ciphertext ] = DES( ciphertext,keys )
% 对称密码算法  分组加密
% ciphertext 待加密明文
% key 密钥
% ciphertext 加密以后的密文
% 按照字符串处理

ciphertext_ip = transform( ciphertext );        % 进行IP置换
text = ciphertext_ip;
Ltext = text(:,1:1:32);     % 左半部分
Rtext = text(:,33:1:64);    % 右半部分
for i=1:16      % 16轮结构变换
    NextL = Rtext;          % 下一轮的L是上一轮的R
    now_key = keys(i,:);           % 这一轮加密的密钥
    Rtext_E = Entend_box(Rtext);      % 32位数据放入E盒扩展成48位
    for j=1:48
        Rtext_E(j)=dec2bin(xor(bin2dec(Rtext_E(j)),bin2dec(now_key(j))));  % 与密钥异或处理
    end
    Rtext = Substitute_box(Rtext_E);    % S盒压缩
    Rtext = P_box(Rtext) ;     % 对S盒输出进行IP置换  
    for j=1:32
        Rtext(j)=dec2bin(xor(bin2dec(Rtext(j)),bin2dec(Ltext(j))));  % 与上一轮L异或处理
    end
    Ltext = NextL;
    
end
    %   text = [Ltext,Rtext];   这样是错的
    text = [Rtext,Ltext];
    ciphertext = anti_transform(text);  
end

function [ ciphertext_ip ] = transform( ciphertext )
% 对明文进行IP置换
% ciphertext 明文
% ciphertext_ip IP置换后的明文
ciphertext_ip = blanks(64);     % 预分配内存64bit
IP_table = [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置换表
for i=1:64
    ciphertext_ip(i)=ciphertext(IP_table(i));
end
end

function [Rtext_E] = Entend_box(Rtext)
% 对右半部分扩展成48位便于异或操作
% Rtext 待扩展数据
% Rtext_E E扩展后的数据

Rtext_E = blanks(48);     % 预分配内存48bit
ex_tab = [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];   % E扩展表
for i=1:48
    Rtext_E(i)=Rtext(ex_tab(i));    % 32位扩展成48位
end
end

function [Rtext] = Substitute_box(Rtext_E)
% S盒压缩成32位
stab(:,:,1)=[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];
stab(:,:,2)=[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];
stab(:,:,3)=[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];
stab(:,:,4)=[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];
stab(:,:,5)=[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];
stab(:,:,6)=[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];
stab(:,:,7)=[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];
stab(:,:,8)=[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];
% 8个S盒的表
Rtext='';
for i=1:8
    s = stab(:,:,i);
    str = Rtext_E(:,i*6-5:i*6);
    m = bin2dec([str(1),str(6)]);       % S盒的行列计数都是从0开始
    n = bin2dec(str(:,2:5));    
    temp = dec2base(s(m+1,n+1),2,4);  % s盒第m行n列,4位二进制
    Rtext = [Rtext,temp];  
end
end

function [ stext_ip ] = P_box( stext )
% 对S盒的输出进行IP置换
% ciphertext 明文
% ciphertext_ip IP置换后的明文
stext_ip = blanks(32);     % 预分配内存32bit
IP_table = [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];  % IP置换表
        
for i=1:32
    stext_ip(i)=stext(IP_table(i));
end
end

function [ text_ip ] = anti_transform( text )
% 对最终结果进行IP逆置换
text_ip = blanks(64);     % 预分配内存64bit
IP_table = [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置换表
for i=1:64
    text_ip(i)=text(IP_table(i));
end
end

generate_keys.m

function [ keys ] = generate_keys( keyword )
%	根据密钥生成16轮子密钥
    if length(keyword)~=8
        disp(['给个八位的密码行不行啊!!!'])
        return
    end
    binkwd='';
    bin_keyword = dec2base(keyword,2,8);    % 转8位二进制
    for i=1:8
        binkwd = [binkwd,bin_keyword(i,:)];
    end
    bkwd = PC_1(binkwd);      % pc-1打乱次序
    mov_bit=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1];  % 每一轮循环移位的位数
    C0 = bkwd(1:28);
    D0 = bkwd(29:56);
    
    for i=1:16
        C0=[C0(1+mov_bit(i):end),C0(1:mov_bit(i))];
        D0=[D0(1+mov_bit(i):end),D0(1:mov_bit(i))];     % 循环移位
        bfkey = [C0,D0];
        keys(i,:)=PC_2(bfkey);
    end
end

function [Bkwd]=PC_1(bkwd)
% PC_1置换
PC1_tab = [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,64,53,45,37,29,21,13, 5,28,20,12,4];
for i=1:56
    Bkwd(i)=bkwd(PC1_tab(i));
end
end
function [key]=PC_2(bfkey)
% PC_2置换
PC2_tab = [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];
for i=1:48
    key(i)=bfkey(PC2_tab(i));
end
end

convert_mess2bin.m

function [ text ] = convert_mess2bin( mess )
%   把明文转成二进制
    if length(mess)~=8
        disp(['给个八位的明文行不行啊!!!'])
        return
    end
    text='';
    mess = dec2base(mess,2,8);    % 转8位二进制
    for i=1:8
        text = [text,mess(i,:)];
    end
end

convert_bin2mess

function [ mess ] = convert_bin2mess( binn )
    mess = '';
    for i=1:8
        a =(i-1)*8+1;
        str = binn(a:a+7);
        mess = [mess,char(bin2dec(str))];
    end
end
  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值