凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行.
他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A将被替换成 D,B 变成 E,以此类推 X 将变成 A,Y 变成 B,Z 变成 C。由此可见,位数就是凯撒密码加密和解密的**。
一.MATLAB 程序代码如下:
- 凯撒密码加密函数:
function Y=caesarCode(X,K)
%其中X表示明文,K表示**
A=['z','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'];
B=['Z','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'];
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才是真正移动的位数
Y(i)=A(n+1);
end
end
elseif emp>=65 & emp<=90
for j=1:26
if X(i)==B(j)%判断是哪一个大写的26个字母
n=mod(j+K-1,26);
Y(i)=B(n+1);
end
end
else
Y(i)=X(i);%对标点和空格等其他字符保持原状
end
end
- 加密主函数:
clc,clear;
string='I am a good boy';
len=20;Y=caesarCode(string,len);%调用CaesarCode函数加密
disp('凯撒加密后的输出为:');
disp(Y);
- 解密函数:
function Y=Caesarjiemi(string,key)
%其中string表示密文,key表示**
A=['z','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'];
B=['Z','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'];
L=length(string); %获取密文的长度
for i=1:L
emp=abs(string(i));%获取密文所有符号对应的ASCII码
if emp>=97 && emp<=123 %小写字母a到z的ASCII码是97~123
for j=1:26
if string(i)==A(j)%判断是哪一个小写字母
n=mod(j-key-1,26);%由于是从z开始而不是从a开始所以要减1才是真正移动的位数
Y(i)=A(n+1);
end
end
elseif emp>=65 && emp<=90%判断是哪一个大写字母
for j=1:26
if string(i)==B(j)%判断是哪一个大写字母
n=mod(j-key-1,26);
Y(i)=B(n+1);
end
end
else
Y(i)=string(i); %对标点和空格等其他字符保持原状
end
end
- 解密主函数:
clc,clear;
for key=1:26
str='C ug u aiix vis';
disp(['第',num2str(key),'次']);
Y=Caesarjiemi(str,key)
end
二.实验结果:
1.对字符串‘I am a good boy’加密,加密后的字符串为‘C ug u aiix vis’,实验截图如下:
2.解密是加密的反过程,解密如下:
在第20次尝试时得到正确结果。由于凯撒密码的秘钥只有26种可能,所以采用遍历法,根据解密结果的实际含义来推断出加密前的内容。
|
请发表评论