我发现加密算法在下面的“the_cipher_decipher_func”中实现:
#include <string>
#include <iostream>
#include <algorithm>
std::string cipher_decipher(const std::string& src, char mask, const char incr, const char mod)
{
const auto the_cipher_decipher_func = [&](const char c)
{
mask = (mask + incr) % mod;
return static_cast<char>(c ^ mask);
};
auto tgt = std::string{};
std::transform(src.cbegin(), src.cend(), std::back_inserter(tgt), the_cipher_decipher_func);
return tgt;
}
int main(int argc, char* argv[])
{
if (argc < 2)
return 1;
auto source = std::string{argv[1]};
const char incr = 12; // arbitrary
const char mod = 50; // arbitrary
const char initial_mask = mod / incr; // arbitrary, but lower than "mod".
auto mask_cipher = initial_mask;
auto ciphered = cipher_decipher(source, mask_cipher, incr, mod);
auto mask_decipher = initial_mask;
auto deciphered = cipher_decipher(ciphered, mask_decipher, incr, mod);
std::cout
<< "source: " << source << std::endl
<< "ciphered: " << ciphered << std::endl
<< "deciphered: " << deciphered << std::endl
;
return 0;
}
它似乎是XOR和增量键的混合。但是,是否有人可以确定此加密算法的确切来源?
答案 0 :(得分:4)
密码本身(通过XOR将密钥流与纯文本相结合)称为Vernam Cipher(以其发明者Gilbert Vernam命名)。
我不知道这种创建密钥流的特定方法的名称,尽管它所属的组有许多众所周知的名称,例如&#34; bad&#34;,&# 34;糟糕的&#34;,&#34;破碎&#34;。
这个例子看起来特别成问题。如果(例如)mod
和incr
都是素数,那么在重复之前,您至少会增加密钥流中的字符数。原样,它会在很短的时间后重复(这会让攻击者使用较少的密文找到密钥流)。