【Matlab学习】凯撒密码Caesar‘s cypher

  • Post author:
  • Post category:其他


简介

凯撒密码是历史上已知最早的密码之一。凯撒密码中的每个字母在字母表中“移动”了一定的位置。例如,如果密码为1,则A将替换为B,B将替换为C,依此类推。相传最早是凯撒大帝用来和将军进行秘密交流时所用的加密方法。



题目要求

请设计凯撒密码,使用函数caesar(s,code),输入s表示明文,code表示密钥。输出密码coded表示对明文加密后的密码。

需要注意的是,输入和输出的字符都是ASCII码中32-126的字符,如果密钥超过了此范围则在此区间循环,例如,如果明文‘~’(ASCII码126)的密钥是1,则结果应该返回(ASCII码32,空格)‘ ’; 如果明文是空格‘ ’(ASCII码32,空格),密钥是-1,则结果应该返回 ‘~ ’(ASCII码126);

32-126的符号如下所示:

>> ' ':'~'

ans =

    ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
    >> list=double(ans);

需要注意的是32-126期间有

95

个字符。

在这里插入图片描述

例子

函数例子



代码设计思路

  1. 首先要计算位移量,始终是在95个字符之间移动
  2. 确定加密之后的字符位置



代码设计

function out=caesar(s,code)

%判断位移量范围(-95,95)
if code>=0
    code=mod(code,95);
else
    code = mod(code,95)-95;
end
%确定加密后的字符位置
c=code+s;
for ii=1:length(c)  
    if c(1,ii)>126
        c(1,ii)=c(1,ii)-95;
    elseif c(ii)<32
        c(1,ii)=c(1,ii)+95;
    end
end
out=char(c);

end

运算结果

输入

coded    = caesar('ABCD',  3)
decoded  = caesar(coded,  -3)
wrap     = caesar('1234', 96)
back     = caesar(wrap,  -96)

结果:

coded =

    'DEFG'


decoded =

    'ABCD'


wrap =

    '2345'


back =

    '1234'

官方给出的答案真的十分的简洁,如果掌握了数组或者更多的函数使用技巧,都不需要用到循环结构。以下是官方给出的答案。



官方答案:

加密:

function txt = caesar(txt,key)
    txt = double(txt) + key;
    first = double(' ');
    last = double('~');
    % use mod to shift the characters - notice the + 1
    % this is a common error and results in shifts 
    % being off by 1
    txt = char(mod(txt - first,last - first + 1) + first);
end

解密

function y = caesar2(ch, key)
    v = ' ' : '~';
    [~, loc] = ismember(ch, v);
    v2 = circshift(v, -key);
    y = v2(loc);
end

思考:

以上是自己对于Caesar密码的解题思路,在这个期间发现debug过程真的很痛苦,这其中的95真的是花费了好久才发现的问题,一开始一直以为是126-32=94个字符在循环。所以加密和解密都没有发现问题所在,后面才知道错在了94。虽然是很低级的错误,但是却花费了不少精力和时间。不过要在每次错误中吸取教训,只有经历这些才会有所成长。



版权声明:本文为weixin_44706460原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。