我需要使用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'用于在相应索引上交换字符的循环?或者还有另一种更好的字母排列解决方案。
我非常感谢你的帮助。
答案 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