使用VS2017在发布模式下Crypto ++ AES崩溃

时间:2018-10-29 18:29:07

标签: c++ windows visual-studio crypto++

我有以下代码。字符串“ 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块填充”)

https://www.cryptopp.com/wiki/CBC_mode

1 个答案:

答案 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 f57df06c5e6dpragma 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);