Matlab将字符串读作转换密码的数组

时间:2015-05-08 04:44:58

标签: matlab

我需要使用Matlab来实现转置算法。 我们假设您有一个名为变量的变量 plaintext='qwerty........zxcv'(文本的确无关紧要,但字母应包含A-Z和空格字符) 和一个名为

的变量
lof = length(plaintext) %. (the size of the message)

此外,您还有以下转置(存储在变量tp中):

1 2 3 4 5
5 3 1 4 2

tp = '5 3 1 4 2';

我想过使用变量缓冲区和ltp = length(tp)。 在变量缓冲区中,我会一次读取ltp个字符,直到明文中没有字符。 所以,我需要一些建议如何一次从明文读取ltp个字母。 另外,如果'缓冲区'变量让我们说5个字符,然后我应该使用' for'用于在相应索引上交换字符的循环?或者还有另一种更好的字母排列解决方案。

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解你想要什么,你将文本分成5个字符块。然后,使用转置变量tp执行这些块的排列,并重新组合这些块,以便创建密文来加密明文。因此,每个块的位置1-5处的字符被重新排列,使得:

Source --> Target
   1         5
   2         3
   3         1
   4         4
   5         2

根据我的看法,让我们从最简单的方式开始。您可以按照建议使用for循环。使用循环并创建从索引1开始并跳过一定数量字符的值 - 这等于tp的长度。然后,您将使用这些索引切入字符数组并执行字符的排列。确保创建一个与输入大小相同的输出数组,然后对每个块进行排列。

这样的事情:

%// Define plain text
plaintext = 'hello my name is ray nice to meet you';

%// Define permutation vector
tp = [5 3 1 4 2];
ltp = numel(tp); %// Define length of transposition
lp = numel(plaintext); %// Length of plaintext

%// Declare ciphertext array
ciphertext = char(zeros(1,lp));

%// Pad the array with spaces so that when we grab chunks, we don't
%// go out of bounds
plaintext = [plaintext 32*ones(1,ltp*ceil(lp/ltp) - lp)];

%// For each chunk...
for idx = 1 : ltp : lp
    %// Get the plain text chunk
    tx = plaintext(idx : idx+ltp-1);

    %// Permute the chunk and place back into output array
    ciphertext(idx : idx+ltp-1) = tx(tp);
end

所以纯文本是:

plaintext = 'hello my name is ray nice to meet you';

我得到的输出是:

ciphertext = 

olhleny  miea myrsa ei cnmo  tyte e  o u

更加向量化的解决方案(如果你很好奇)将重塑数组,以便行数与转置向量的长度匹配,列数是分解文本的块数,一次你填充数组,以便我们不会超出界限。这样,每列代表一个唯一的块。然后,您将置换此矩阵的行并将其重新整形。

这样的事情:

%// Define plain text
plaintext = 'hello my name is ray nice to meet you';

%// Define permutation vector
tp = [5 3 1 4 2];
ltp = numel(tp); %// Define length of transposition
lp = numel(plaintext); %// Length of plaintext

%// Pad the array with spaces so that when we grab chunks, we don't
%// go out of bounds
plaintext = [plaintext 32*ones(1,ltp*ceil(lp/ltp) - lp)];

%// Begin vectorized solution
ciphertext = reshape(plaintext, ltp, []);
ciphertext = reshape(ciphertext(tp, :), 1, []);

我们仍然得到了我们在第一次尝试中看到的内容:

ciphertext =

olhleny  miea myrsa ei cnmo  tyte e  o u