简介
凯撒密码是历史上已知最早的密码之一。凯撒密码中的每个字母在字母表中“移动”了一定的位置。例如,如果密码为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
个字符。
例子
代码设计思路
- 首先要计算位移量,始终是在95个字符之间移动
- 确定加密之后的字符位置
代码设计
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。虽然是很低级的错误,但是却花费了不少精力和时间。不过要在每次错误中吸取教训,只有经历这些才会有所成长。