我有一个简单的程序,可以根据从文本文件获得的输入来加密和解密文本。当我在一个周期内进行加密和解密时,会得到所需的结果,但是如果我加密,关闭应用程序然后重新运行应用程序,这次解密,则过程将失败。
解密代码如下:
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
不知道为什么在同一版本中进行加密和解密会起作用,但是如果我尝试不首先在同一运行中先进行加密就进行解密,则会失败。
ECB_Mode<AES>::Decryption decryption;
ECB模式以完整的块大小运行,不需要填充。
您可以填充它,但是看起来却不是这样。需要注意的是,纯文本必须为16的倍数,这是AES的块大小。
当我将try-catch块包装在解密函数周围时,出现此错误
StreamTransformationFilter: invalid PKCS #7 block padding found
那是因为您要填充它:
StreamTransformationFilter(decryption, new StringSink(...)).
StreamTransformationFilter
具有padding参数。如您所知,这是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 mode
,GCM mode
或CCM mode
。如果这超出了预期,我深表歉意。
更好的是,使用诸如椭圆曲线集成加密方案(ECIES)或离散对数集成加密方案(DLIES)之类的方案。这些方案是IND-CCA,这是一个非常强烈的安全性概念。
使用ECIES或DLIES时,您的问题将减少到共享公共密钥。但是现在对称密钥就存在这个问题,因此对于密钥分发来说这是一个横向举措,而对于加密则是一个胜利。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句