Simple DES加密,简单的DES加密的Matlab实现

来自信息安全的作业,包含两个文件,读者需要自己创建.只进行了两轮des加密,输入为字符

输出为8位的数字

密文是“ABCD”

输出结果:

 

代码

% 实现3-des 算法
% 2019-5-15
% clear all;
text='ABCD';
% ascii码65 66 67 68
P10=[3 5 2 7 4 10 1 9 8 6];
P8=[6 3 7 4 8 5 10 9];
P4=[2 4 3 1];
K=[1 0 1 0 0 0 0 0 1 0];
IP=[2 6 3 1 4 8 5 7];
IP_len=length(IP);
IPinv=[4 1 3 5 7 2 8 6];
EP=[4 1 2 3 2 3 4 1];
S0=[1 0 3 2;3 2 1 0;0 2 1 3;3 1 0 2];
S1=[0 1 2 3;2 0 1 3;3 2 1 0;2 1 0 3];
% S0ch=['01001110';'11100100';'00100111';'11010010'];
% S1ch=['00011011';'10000111';'11100100';'10010011'];
%% 先获得密钥K1与K2
matrixP10=K(P10);
lenP10=length(matrixP10);
matrixP10_L=matrixP10(1:lenP10/2);
matrixP10_Llen=length(matrixP10_L);
% 左移一位
matrixP10_L=matrixP10_L([2:matrixP10_Llen,1]);
matrixP10_R=matrixP10(lenP10/2+1:lenP10);
matrixP10_Rlen=length(matrixP10_R);
% 右移一位
matrixP10_R=matrixP10_R([2:matrixP10_Rlen,1]);
K1temp=[matrixP10_L,matrixP10_R];
K1=K1temp(P8);
% 左右进行移两位
matrixP10_L=matrixP10_L([3:matrixP10_Llen,1:2]);
matrixP10_R=matrixP10_R([3:matrixP10_Rlen,1:2]);
K2temp=[matrixP10_L,matrixP10_R];
K2=K2temp(P8);
%% 进行F函数的实现   dec2bin() 实现数据到二进制的转换
text_len=length(text);
text_matrix=zeros(text_len,8);      % text_matrix记录文本转换矩阵
standN=8;
for i=1:text_len        % 将文本转化为八位的二进制
    temp=dec2bin(text(i));
    temp_len=length(temp);
    for j=1:standN-temp_len
        temp=['0',temp];
    end
    tempbin=changebin(temp);
    text_matrix(i,:)=tempbin;
end
% 进行两轮循环
count=2;
P4bin=zeros(1,4);   % 存储二进制的P4矩阵
mainK=[K1;K2];
coding=zeros(size(text_matrix));% 初始化加密文本
N=1;
for i=1:text_len
    temprow=text_matrix(i,:);
    temp=temprow(IP);
    for N=1:count       
        IP_L=temp(1:IP_len/2);
        IP_R=temp(IP_len/2+1:IP_len);
        tempIP_R1=IP_R(EP(1:4));
        tempIP_R2=IP_R(EP(5:8));
        EP8=[tempIP_R1,tempIP_R2];  % 完成EP8矩阵的扩展 
        result1=xor(EP8,mainK(N,:));
        S0L=result1(1:4);
        S1R=result1(5:8);
        S0output=S0(2*S0L(1)+S0L(4)+1,2*S0L(2)+S0L(3)+1);
        S1output=S1(2*S1R(1)+S1R(4)+1,2*S1R(2)+S1R(3)+1);
        P4input=[S0output,S1output];    % 完成S矩阵数字到二进制的转换
        P4bin(1)=floor(P4input(1)/2);
        P4bin(2)=mod(P4input(1),2);
        P4bin(3)=floor(P4input(2)/2);
        P4bin(4)=mod(P4input(2),2);
        P4output=P4bin(P4);
        SWinput=xor(IP_L,P4output);
        if N==1         % 完成SW模块
            temp=[IP_R,SWinput];
        end
    end
    tempcoding=[SWinput,IP_R];
    coding(i,:)=tempcoding(IPinv);  
end
disp(coding);

 

% 第二个函数

% 该函数主要是将字符串的 ‘0101‘编程数字0 1 0 1
% 2019-5-15
function temp=changebin(str)
strlen=length(str);
temp=zeros(1,strlen);
for i=1:strlen
    if str(i)=='0'
        temp(i)=0;
    elseif str(i)=='1'
        temp(i)=1;
    end
end

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值