凯撒的密码加密算法

时间:2019-03-18 09:06:00

标签: algorithm matlab encryption modulus algebra

  

Caesar的密码是最简单的加密算法。它将固定值添加到文本的每个字符的ASCII(unicode)值。换句话说,它移动字符。解密文本只是将文本移回相同的数量,也就是说,它从字符中减去了相同的值。

我的任务是编写一个函数:

  • 接受两个参数:第一个是要加密的字符向量,第二个是移位量。
  • 返回一个输出,即加密的文本。
  • 需要使用从空格到~的所有可见ASCII字符(ASCII码从32到126)。如果移位后的代码不在此范围内,则应回绕。例如,如果我们将~1,则结果应该是空格。如果我们将空间移动-1,则结果应为~

这是我的MATLAB代码:

function [coded] = caesar(input_text, shift)
x = double(input_text); %converts char symbols to double format
for ii = 1:length(x) %go through each element
    if (x(ii) + shift > 126) & (mod(x(ii) + shift, 127) < 32)
        x(ii) = mod(x(ii) + shift, 127) + 32; %if the symbol + shift > 126, I make it 32
    elseif (x(ii) + shift > 126) & (mod(x(ii) + shift, 127) >= 32)
        x(ii) = mod(x(ii) + shift, 127);
    elseif (x(ii) + shift < 32) & (126 + (x(ii) + shift - 32 + 1) >= 32)
        x(ii) = 126 + (x(ii) + shift - 32 + 1);
    elseif (x(ii) + shift < 32) & (126 + (x(ii) + shift - 32 + 1) < 32)
        x(ii) = abs(x(ii) - 32 + shift - 32);
    else x(ii) = x(ii) + shift;
    end
end
     coded = char(x); % converts double format back to char
end

我似乎无法正确进行换行转换(例如,从31转换为126,从30转换为125,从127转换为32,依此类推)。我应该如何更改代码来做到这一点?

3 个答案:

答案 0 :(得分:2)

在甚至开始编写类似代码之前,您应该对如何解决该问题有一个把握。

您遇到的主要障碍是如何将模运算应用于数据,看看如何mod将输入“包装”到[0 modPeriod-1]的范围,而您自己的数据在{{ 1}}。为了使[32 126]在这种情况下有用,我们执行一个中间步骤,即将输入转移mod“喜欢”的范围,即从某些mod[minVal maxVal]

因此,我们需要找到两件事:所需班次的大小和[0 modPeriod-1]的周期的大小。第一个很简单,因为它只是mod,它是第一个字符的ASCII值(为空格)的负数(在MATLAB中写为-minVal)。对于' '的周期,这只是您的“字母”的大小,恰好是“移位后比最大值大1”或换句话说-mod。本质上,我们正在做的是以下

maxVal-minVal+1

现在看一下如何使用MATLAB的矢量化表示法编写该代码:

input -> shift to 0-based ("mod") domain -> apply mod() -> shift back -> output

以下是一些测试:

function [coded] = caesar(input_text, shift)
FIRST_PRINTABLE = ' ';
LAST_PRINTABLE = '~';
N_PRINTABLE_CHARS = LAST_PRINTABLE - FIRST_PRINTABLE  + 1;

coded = char(mod(input_text - FIRST_PRINTABLE + shift, N_PRINTABLE_CHARS) + FIRST_PRINTABLE);

答案 1 :(得分:0)

我们可以使用周期函数的思想来解决它: 周期函数在每个周期重复一次,每个周期等于 ...

像周期函数一样,我们有一个函数,每95个值重复一次

周期= 126-32 + 1; 我们添加一个是因为'32'也在循环中...

因此,如果字符的值超过'126',我们减去95,

  

即如果值= 127(大于126 ),则等于   127-95 = 32。

&如果该值小于32,则减去95。

  

即如果值= 31(小于32 ),则等于31 + 95   = 126 ..

现在,我们将其翻译为代码:

function out= caesar(string,shift)
value=string+shift;

for i=1:length(value)
    while value(i)<32
        value(i)=value(i)+95;
    end
    while value(i)>126 
        value(i)=value(i)-95;
    end

end
out=char(value);

答案 2 :(得分:0)

首先,我将输出(shift + text_input)转换为char。

function coded= caesar(text_input,shift)
coded=char(text_input+shift);

for i=1:length(coded)
    while coded(i)<32
        coded(i)=coded(i)+95;
    end
    while coded(i)>126 
        coded(i)=coded(i)-95;
    end

end
相关问题