2

我在 CS106L 中做关于 STL 算法的练习,其中一个问题是关于使用 random_shuffle 进行替换加密。

问题是使用 random_shuffle 实现一个函数 MonoalphabeticSubstitutionEncrypt,它接受一个源字符串并用随机的 Monoalphabetic Substitution Cipher 对其进行加密。

这意味着一开始我有“AB..XYZ”,只是将 random_shuffle 调用到 AZ 并生成类似“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;
}
4

2 回答 2

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 类的文档: 字符串 向量 ostream

使用的 stl 方法的文档:generate_n random_shuffle 变换

如果这篇文章泄露太多,有人编辑它。

于 2012-07-26T00:17:14.687 回答
0

我将使用一个映射类,该类在创建时创建和打乱数组/向量,并重载operator()以返回输入的加密版本。为了发挥更大的作用,您还需要一个成员函数(或者可能是运算符)来检索打乱的字母表以用作解密的密钥。

有了这个,用std::transform.

于 2012-07-25T22:53:04.923 回答