如何使用 Crypto++ 将文件内容转发到 StringSink?

How to forward file content to StringSink with Crypto++?


我正在使用 Crypto++ 的一些测试代码来适应它。
有一个函数:

void DecryptFile(const char *in, const char *out, const char *passPhrase)
{
    FileSource f(in, true, new DefaultDecryptorWithMAC(passPhrase, new FileSink(out)));
}

其中 DecryptFile#define DecryptFile DecryptFileW(我在 Windows)。

所以,文件解密是通过DecryptFile(name_f.c_str(), "decrypted_alphabet.txt", cpass);
调用的 如果 cpass 正确,则 name_f.c_str() 文件的内容被写入 decrypted_alphabet.txt.

现在是问题:我找不到将文件内容转发到 StringSink 而不是文件的方法!我试着手动调用这个:

string out;
FileSource (in, true, new DefaultDecryptorWithMAC(cpass, new StringSink(out)));

但是这个 returns 一些糟糕的字符,例如 ъ!$5(#(每次都是新的)。也许我无法正确解释我的问题,所以,这是一段代码,我尝试破解一个 4 位数字的受保护 txt 文件:http://pastebin.com/FJng91Y6

How to forward file content to StringSink with Crypto++?
...
Now the problem: I can't find the way to forward file contents to StringSink rather than to a file! I tried manually calling this:

string out;
FileSource (in, true, new DefaultDecryptorWithMAC(cpass, new StringSink(out)));

这按预期工作。


but this returns some crappy characters like ъ!$ or 5(# (every time new). Maybe I can't explain my problem properly, so, here's piece of code, where I try to crack a 4-digit protected txt file

是的,听起来不错(如果我没看错的话)。您在 4 位密码上产生冲突。为避免冲突,您需要更长的密码。


也许您应该完成对组合的枚举,而不是在第一次匹配时停止处理:

if (strlen(cpass) > 0){
    printf("Alphabet password is: %s\n", cpass);
    return;
}

收集所有可能的解密,然后进一步分析它们寻找"good"解密。也许您应该使用 PIN 将它们保存到文件中:

  • 解密.1234
  • 解密.4287
  • 解密.6862
  • 解密.8946