C++ 当程序重新启动时,使用相同的加密密钥不解密文件

C++ 当程序重新启动时,使用相同的加密密钥不解密文件,c++,encryption,cryptography,crypto++,C++,Encryption,Cryptography,Crypto++,我有一个简单的程序,可以加密和解密文本文件输入的文本。当我在一个周期内加密和解密时,我会得到想要的结果,但如果我加密,关闭应用程序,然后重新运行应用程序,这次解密,进程失败 解密代码段如下所示: string decoded, plainText; string fileData((istreambuf_iterator<char>(fileDecrypt)), (istreambuf_iterator<char>())); ECB_Mode<AES>::D

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

解密代码段如下所示:

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)));
当我在decrypt函数周围包装一个try-catch块时,我得到了这个错误

StreamTransformationFilter: invalid PKCS #7 block padding found
如果我在一次编译中加密和解密,我不知道为什么它会工作,但是如果我在同一次运行中没有首先加密就尝试解密,那么它会失败

。正如你可能意识到的,它是


尝试:


还有一个快速警告

欧洲央行的模式通常是错误的。我不是说在这种情况下是这样,也不是说你错了。但是你可能想看看,或者。如果这超出了我的想象,我深表歉意

更好的是,使用类似或的方案。这些方案是安全的,这是一个非常强烈的安全概念


使用ECIE或DLIE时,您的问题归结为共享公钥。但现在对称密钥存在这个问题,所以这是密钥分发的横向移动,也是加密的胜利。

我们之前已经告诉过您。我建议您加密、写入、终止、重新启动、加密、读取和比较密文的两个版本。@Beta-有足够的信息可以回答这个问题。
StreamTransformationFilter: invalid PKCS #7 block padding found
ECB_Mode<AES>::Decryption decryption;
StreamTransformationFilter(decryption, new StringSink(...)).
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));
ECB_Mode<AES>::Decryption decryption;
StringSource ss1(fileData, ...);
StringSource ss2(decoded, ...);