Matlab。传统密码――凯撒密码,替换Substitution逆向解码

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

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    对于凯撒密码的解码部分,需要将密文中的每个字符的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)将得到正确的解码结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^