我有以下代码。字符串“ abcd”的加密和解密的非常简单的示例。我已经使用来自Crypto ++(Long
)的示例进行了尝试,它会产生相同的异常。
AutoSeededRandomPool rand;
SecByteBlock key(nullptr, AES::MAX_KEYLENGTH);
rand.GenerateBlock(key, key.size());
byte iv[AES::BLOCKSIZE];
rand.GenerateBlock(iv, AES::BLOCKSIZE);
std::string encryptedData;
CBC_Mode<AES>::Encryption cbcEncryption(key, key.size(), iv);
StringSource ss("abcd", true,
new StreamTransformationFilter(cbcEncryption,
new StringSink(encryptedData)
)
);
std::string decryptedData;
CBC_Mode<AES>::Decryption cbcDecryption(key, key.size(), iv);
StringSource ss2(encryptedData, true,
new StreamTransformationFilter(cbcDecryption,
new StringSink(decryptedData)
)
);
问题是当我在调试模式下构建时,它工作正常,但是当我在发布模式下运行时,我从Crypto ++代码中得到了异常(“ StreamTransformationFilter:发现无效的PKCS#7块填充”)
答案 0 :(得分:1)
问题是当我在调试模式下构建时,它工作正常,但是当我在发布模式下运行时,我收到了Crypto ++代码的异常(“ StreamTransformationFilter:发现无效的PKCS#7块填充”)...
这似乎是与全局优化有关的编译器问题。我们的解决方法是禁用源文件rijndael.cpp
的全局优化。
在rijndael.cpp
中,您可以在文件顶部周围添加以下内容,以避免出现此问题:
#if defined(_MSC_VER) && (_MSC_VER >= 1910)
# pragma optimize("", off)
# pragma optimize("ts", on)
#endif
您可以在rijndael.cpp
中用以下内容重现该问题:
#if defined(_MSC_VER) && (_MSC_VER >= 1910)
# pragma optimize("", off)
# pragma optimize("g", on)
#endif
另请参见MSDN上的Commit f57df06c5e6d和pragma optimize
。
如果您的计算机具有AES-NI,但您想重现该问题,请在g_hasAESNI
中注释掉分配cpu.cpp
的代码。 g_hasAESNI
将保留false
的默认值。
--- a/cpu.cpp
+++ b/cpu.cpp
@@ -242,7 +242,7 @@ void DetectX86Features()
g_hasSSSE3 = g_hasSSE2 && ((cpuid1[2] & (1<< 9)) != 0);
g_hasSSE41 = g_hasSSE2 && ((cpuid1[2] & (1<<19)) != 0);
g_hasSSE42 = g_hasSSE2 && ((cpuid1[2] & (1<<20)) != 0);
- g_hasAESNI = g_hasSSE2 && ((cpuid1[2] & (1<<25)) != 0);
+ //g_hasAESNI = g_hasSSE2 && ((cpuid1[2] & (1<<25)) != 0);
g_hasCLMUL = g_hasSSE2 && ((cpuid1[2] & (1<< 1)) != 0);