单细胞替代使用STL加密,cs106l

时间:2012-07-25 22:42:10

标签: c++ stl

我在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;
}

2 个答案:

答案 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进行加密本身应该是微不足道的。