使用相同的加密密钥在程序重新启动时文件不解密

时间:2015-11-17 05:45:42

标签: c++ encryption cryptography crypto++

我有一个简单的程序,可以加密和解密来自文本文件的输入文本。当我在一个周期内加密和解密时,我得到了所需的结果,但如果我加密,关闭应用程序然后重新运行应用程序,这次解密,该过程失败。

解密片段如下所示:

string decoded, plainText;
string fileData((istreambuf_iterator<char>(fileDecrypt)), (istreambuf_iterator<char>()));

ECB_Mode<AES>::Decryption decryption;
decryption.SetKey((byte*)key.c_str(), sizeof(key));
StringSource(fileData, true, new HexDecoder(new StringSink(decoded)));
StringSource(decoded, true, new StreamTransformationFilter(decryption, new StringSink(plainText)));

当我在VS2010中运行调试器时,我在最后一行得到错误

StringSource(decoded, true, new StreamTransformationFilter(decryption, new StringSink(plainText)));

当我在解密函数周围包装try-catch块时,我收到此错误

StreamTransformationFilter: invalid PKCS #7 block padding found

如果我在一个版本中加密和解密,不确定为什么它会起作用,但如果我尝试在没有首先在同一次运行中加密的情况下进行解密,则会失败。

1 个答案:

答案 0 :(得分:2)

ECB_Mode<AES>::Decryption decryption;

ECB模式以整个块大小运行,不需要填充。

你可以填充它,但它看起来不像你这样做。需要注意的是,纯文本必须是16的倍数,这是AES的块大小。

  

当我在解密函数周围包装try-catch块时,我得到了这个   错误

     

<强> StreamTransformationFilter: invalid PKCS #7 block padding found

那是因为你在填充它:

StreamTransformationFilter(decryption, new StringSink(...)).

StreamTransformationFilter has a padding parameter。你可能已经意识到,它是BlockPaddingScheme::PKCS_PADDING

尝试:

ECB_Mode<AES>::Decryption decryption;
decryption.SetKey((byte*)key.data(), key.size());

std::string plainText;
StreamTransformationFilter filter(decryption, new StringSink(plainText),
                                  StreamTransformationFilter::NO_PADDING);

FileSource fs(filename.c_str(), true, new HexDecoder(new Redirector(filter)));
...

其他勘误表:

ECB_Mode<AES>::Decryption decryption;
decryption.SetKey((byte*)key.c_str(), sizeof(key));

sizeof(key)错了。使用16,24或32.如果std::string的大小合适,则可以使用key.size()

并命名你的对象。我发现GCC使用Crypto ++生成了错误的代码:

ECB_Mode<AES>::Decryption decryption;
StringSource ss1(fileData, ...);
StringSource ss2(decoded, ...);

快速警告......

ECB模式通常是错误的。我说这是在这种情况下,或者你错了。但您可能需要查看EAX modeGCM modeCCM mode。如果这比看起来更多,我表示道歉。

更好的是,使用Elliptic Curve Integrated Encryption Scheme (ECIES)Discrete Logarithm Integrated Encryption Scheme (DLIES)等方案。这些方案是IND-CCA,这是一个非常强大的安全概念。

使用ECIES或DLIES时,您的问题会减少到共享公钥。但是你现在有了对称密钥的问题,所以它是密钥分发的横向移动,也是加密的胜利。