我在CS106L中练习关于STL算法的练习,其中一个问题是关于使用random_shuffle进行替换加密。
问题是 使用random_shuffle实现一个MonoalphabeticSubstitutionEncrypt函数,它接受一个源字符串并用随机的Monoalphabetic Substitution Cipher加密它。
这意味着我一开始就有 “AB..XYZ”,只是将random_shuffle称为A-Z 并生成类似“KVDQ ... MSB”的内容 然后执行加密原始字符串的映射。
我可以使用映射来完成它,但它应该只使用那些STL算法来完成。
有人有想法吗?谢谢!
我这样做,但似乎我没有使用STL算法的力量
string MonoSubsitutionEncrypt(string line){
string original = "abcdefghijklmnopqrstuvwxyz";
string excrypt = original;
random_shuffle(encrypt.begin(), encrypt.end());
map<char, char> m;
for (int i = 0;i < original.length(); i++)
m.insert(make_pair(original[i],encrypt[i]));
string result;
for (int i = 0; i < line.length(); i++)
result += m[line[i]];
return result;
}
答案 0 :(得分:1)
我刚刚编写了一个版本,随机将字节混合到其他字节中。你必须通过一些箍来让它只接受和输出ascii字符。我特意处理了空字符,因为它应该被保留以指示字符串的结尾。
我的算法的伪代码如下:
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
template class Filler (T)
constructor Filler(T item)
initial = item
T operator () ()
return initial++
private T initial
template class Encryptor (T1, T2)
constructor Encryptor(T1 mapping)
cipher = mapping
T2 operator () (T2 value)
return cipher[value]
private T1 cipher
int main (int c, char * v[])
// stl class, big enough to hold each char
vector<unsigned char> alphabet(256)
// creates a filler object described above
Filler<unsigned char> filler(0)
// stl function, fills alphabet with one of each char
generate_n(alphabet.begin(), 256, filler)
// stl function, shuffles alphabet (start at 1, leave NULL character at beginning)
random_shuffle(alphabet.begin() + 1, alphabet.end())
// creates a generator to be passed to transform
Encryptor<vector<unsigned char>, unsigned char> e(alphabet)
// get input value: either first parameter, or nothing if no parameters
string input = c > 1 ? v[1] : ""
// stl function, uses encryptor containing alphabet mapping to obfuscate input
transform(input.begin(), input.end(), input.begin(), e)
// printing the string yields garbled crap
cout << input << endl;
使用的stl类的文档: string vector ostream
使用的stl方法的文档:generate_n random_shuffle transform
如果这篇文章过多,有人会编辑它。
答案 1 :(得分:0)
我将使用一个映射类,在创建时创建并随机播放数组/向量,并重载operator()
以返回输入的加密版本。为了有用,你还需要一个成员函数(或者可能是运算符)来检索加扰字母表以用作解密密钥。
有了这个,使用std::transform
进行加密本身应该是微不足道的。