Matlab。传统密码――凯撒密码,替换Substitution逆向解码
如图所示,解码过程中'ABC'无法解码为'xyz'而是解码成了‘^_`’
请问该如何修改代码呢?
clc;clear;close all;
key=3;
plaintext='DEFGHIJKLMHOHOOHABC'
len=length(plaintext);
txt = double(plaintext) - key;
for i=1:len
if txt(i)<123
ciphertext(i) = char(txt(i)+32);
else ciphertext(i) = char(txt(i)-32-26);
end
end
ciphertext
对于凯撒密码的解码部分,需要将密文中的每个字符的ASCII码减去密钥key,然后再根据是否大于122(小写字母的最大ASCII码值)分别进行处理。当前代码中,对于小写字母的处理是将其转换为大写字母,这是错误的。
为了修复代码,我们可以将ciphertext(i) = char(txt(i)-32-26);
这一行修改为ciphertext(i) = char(txt(i)+26);
:
clc;clear;close all;
key = 3;
plaintext = 'DEFGHIJKLMHOHOOHABC';
len = length(plaintext);
txt = double(plaintext) - key;
for i = 1:len
if txt(i) < 97
ciphertext(i) = char(txt(i)+26);
else
ciphertext(i) = char(txt(i));
end
end
ciphertext
修改原因是,当前代码中,当txt(i)
是小写字母时,会将其转换为大写字母,而实际上我们需要将其转换为小写字母。因此,在此处将char(txt(i)-32-26)
修改为char(txt(i)+26)
将得到正确的解码结果。