采用改进的凯撒密码进行加密


采用改进的凯撒密码进行加密

一、所用语言

$Matlab$

二、实现原理

原凯撒加密的原理是将需要加密的明文的每位字母进行移位替换来实现加密,但是这样会导致比较容易解密。本次将对凯撒加密方法进行拓展和改进,增加数字位的加密作为拓展,改进的原理为将明文的每位字母或数字进行移位替换后放在输出密码的偶数位,对明文进行反向移位替换,并且将替换后的密码排列顺序反向后放在输出密码的奇数位来实现加密。

例如:明文为123abc,移位数设为1,则加密结果为:b2a3z42b1c0d,偶数位为右移的结果234bcd,奇数位为左移之后反向排列的结果baz210。

三、程序实现

首先定义三个存放26个大写和小写,以及数字0~9的数组,并获取明文的长度:

A=['a','b','c','d','e','f','g','h','i','j','k','l','m','n',...
    'o','p','q','r','s','t','u','v','w','x','y','z'];
B=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
C=['0','1','2','3','4','5','6','7','8','9'];
L=length(X);%获取明文的长度

然后判断明文每位的类型为大写字母、小写字母还是数字,本次通过得到每位的ASCII码来判断,小写字母a~z的ASCII码为97~123,大写字母A~Z的ASCII码为65~90,数字0~9的ASCII码的48~57。

for i=1:L
    emp=abs(X(i));%获取明文对应的ASCII码
if emp>=97 & emp<=123 %小写字母a~z的ASCII码是97~123
…
    elseif emp>=65 & emp<=90 %大写字母A~Z的ASCII码为65~90
    …
    elseif emp>=48 & emp<=57 %数字0~9的ASCII码的48~57
    …
    else
        Y(i)=X(i); %对标点和空格等其他字符保持原状
    end
end

在判断之后,分别对三种类型的明文进行加密,将明文的每位字母或数字进行移位替换后放在输出密码的偶数位,对明文进行反向移位替换,并且将替换后的密码排列顺序反向后放在输出密码的奇数位。下面以小写字母类型为例:

for j=1:26
        if X(i)==A(j)%判断是哪一个小写的26个字母
                n=mod(j+K-1,26); %向右移动的位数
                m=mod(n+24,26); %向左移动的位数
                Y(2*i)=A(n+1); %偶数位为向右移动指定位数后的结果
                Y(2*L-2*i+1)=A(m+1); %奇数位为向左移动的结果,且其对应明文的顺序与原来相反
        end
    end

四、结果验证

在程序中定义了K变量作为移动替换的位数。

设K=1, 即向左、向右移动的位数均为1,对ABC123abc进行加密:

对‘ABC123abc’进行加密,K=1

对同样的明文进行加密,令移动的位数变为明文的长度,即K=len:

对‘ABC123abc’进行加密,K=len

对’I want to be a postgraduate’进行加密:

对’I want to be a postgraduate’进行加密

附代码

demo_xx.m

%made by xx
clc,clear;
string='ABC123abc';
len=20;Y=encode(string,len);%调用CaesarCode函数加密
disp('改进版凯撒加密后的输出为:');
disp(Y);

encode.m

%made by xx
function Y=encode(X,K)
%其中X表示明文,K表示密钥
A=['a','b','c','d','e','f','g','h','i','j','k','l','m','n',...
    'o','p','q','r','s','t','u','v','w','x','y','z'];
B=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
C=['0','1','2','3','4','5','6','7','8','9'];
L=length(X);%获取明文的长度
for i=1:L
    emp=abs(X(i));%获取明文对应的ASCII码
    if emp>=97 & emp<=123 %小写字母a到z的ASCII码是97~123
    for j=1:26
        if X(i)==A(j)%判断是哪一个小写的26个字母
                n=mod(j+K-1,26);%由于是从z开始而不是从a开始所以要减1才是真正移动的位数
                m=mod(n+24,26);%这个是向左移动的位数
                Y(2*i)=A(n+1);%偶数位为向右移动指定位数后的结果
                Y(2*L-2*i+1)=A(m+1);%奇数位为向左移动的结果,且其对应明文的顺序与原来相反
        end
    end
    elseif emp>=65 & emp<=90
        for j=1:26
                if X(i)==B(j)%判断是哪一个大写的26个字母
                    n=mod(j+K-1,26);
                    m=mod(n+24,26);%这个是向左移动的位数
                    Y(2*i)=B(n+1);
                    Y(2*L-2*i+1)=B(m+1);
                end
        end
    elseif emp>=48 & emp<=57
            for j=1:10
                if X(i)==C(j)
                    n=mod(j+K-1,10);
                    m=mod(n+8,10);%这个是向左移动的位数
                    Y(2*i)=C(n+1);
                    Y(2*L-2*i+1)=C(m+1);
                end
            end
    else
        Y(i)=X(i);%对标点和空格等其他字符保持原状
    end
end

文章作者: Mat Jenin
文章链接: http://matjenin.xyz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mat Jenin !
  目录