程序重新启动时文件不解密,使用相同的加密密钥
File not decrypting when program restarts, using the same encrypting key
我有一个简单的程序,可以根据从文本文件中获得的输入来加密和解密文本。当我加密解密一个循环时,我得到了想要的结果,但是如果我加密,关闭应用程序然后重新运行应用程序,这次解密,过程失败。
解密片段如下所示:
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)));
当我在 decrypt 函数周围包装一个 try-catch 块时,出现此错误
StreamTransformationFilter: invalid PKCS #7 block padding found
不知道为什么如果我在一个构建中加密和解密它会起作用,但是如果我尝试解密而不先加密就失败了运行。
ECB_Mode<AES>::Decryption decryption;
ECB 模式在完整块大小上运行,不需要填充。
你可以填充它,但它看起来不像你这样做。需要注意的是纯文本必须是 16 的倍数,这是 AES 的块大小。
When I wrap a try-catch block around decrypt function, I get this
error
StreamTransformationFilter: invalid PKCS #7 block padding found
那是因为你在填充它:
StreamTransformationFilter(decryption, new StringSink(...)).
StreamTransformationFilter
has a padding parameter. As you probably realize, it is 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
or CCM mode
。如果这比看起来更多,我深表歉意。
更好的是,使用像 Elliptic Curve Integrated Encryption Scheme (ECIES) or Discrete Logarithm Integrated Encryption Scheme (DLIES). The schemes are IND-CCA 这样的方案,这是一个非常强大的安全概念。
使用 ECIES 或 DLIES 时,您的问题减少为共享 public 密钥。但是你现在遇到了对称密钥的问题,所以它是密钥分发的横向移动,也是加密的胜利。
我有一个简单的程序,可以根据从文本文件中获得的输入来加密和解密文本。当我加密解密一个循环时,我得到了想要的结果,但是如果我加密,关闭应用程序然后重新运行应用程序,这次解密,过程失败。
解密片段如下所示:
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)));
当我在 decrypt 函数周围包装一个 try-catch 块时,出现此错误
StreamTransformationFilter: invalid PKCS #7 block padding found
不知道为什么如果我在一个构建中加密和解密它会起作用,但是如果我尝试解密而不先加密就失败了运行。
ECB_Mode<AES>::Decryption decryption;
ECB 模式在完整块大小上运行,不需要填充。
你可以填充它,但它看起来不像你这样做。需要注意的是纯文本必须是 16 的倍数,这是 AES 的块大小。
When I wrap a try-catch block around decrypt function, I get this error
StreamTransformationFilter: invalid PKCS #7 block padding found
那是因为你在填充它:
StreamTransformationFilter(decryption, new StringSink(...)).
StreamTransformationFilter
has a padding parameter. As you probably realize, it is 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
or CCM mode
。如果这比看起来更多,我深表歉意。
更好的是,使用像 Elliptic Curve Integrated Encryption Scheme (ECIES) or Discrete Logarithm Integrated Encryption Scheme (DLIES). The schemes are IND-CCA 这样的方案,这是一个非常强大的安全概念。
使用 ECIES 或 DLIES 时,您的问题减少为共享 public 密钥。但是你现在遇到了对称密钥的问题,所以它是密钥分发的横向移动,也是加密的胜利。