C++ 加密++;使用VS2017在发布模式下AES崩溃

C++ 加密++;使用VS2017在发布模式下AES崩溃,c++,windows,visual-studio,crypto++,C++,Windows,Visual Studio,Crypto++,我有以下代码。字符串“abcd”的加密和解密的一个非常简单的示例。我用Crypto++()中的示例进行了尝试,它产生了相同的异常 AutoSeededRandomPool rand; SecByteBlock key(nullptr, AES::MAX_KEYLENGTH); rand.GenerateBlock(key, key.size()); byte iv[AES::BLOCKSIZE]; rand.GenerateBlock(iv, AES::BLOCKSIZE); std::s

我有以下代码。字符串“abcd”的加密和解密的一个非常简单的示例。我用Crypto++()中的示例进行了尝试,它产生了相同的异常

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)
    )
);
autoseedrandopool兰德;
SecByteBlock密钥(nullptr,AES::MAX_keydlength);
rand.GenerateBlock(key,key.size());
字节iv[AES::BLOCKSIZE];
rand.GenerateBlock(iv,AES::BLOCKSIZE);
std::字符串加密数据;
CBC_模式

问题是,当我在调试模式下构建时,它工作得很好,但当我在发布模式下构建时,我从Crypto++代码中得到一个异常(“StreamTransformationFilter:invalid PKCS#7 block padding found”)

这似乎是一个与全局优化相关的编译器问题。我们的解决方法是禁用源文件
rijndael.cpp
的全局优化

rijndael.cpp
中,可以在文件顶部添加以下内容以避免问题:

#如果定义(_MSC_VER)&(_MSC_VER>=1910)
#pragma优化(“,关闭)
#pragma优化(“ts”,打开)
#恩迪夫
您可以在
rijndael.cpp
中复制以下问题:

#如果定义(_MSC_VER)&(_MSC_VER>=1910)
#pragma优化(“,关闭)
#pragma优化(“g”,打开)
#恩迪夫
另请参见MSDN上的和


如果您的机器有AES-NI,但您希望重现该问题,请在
cpu.cpp
中注释掉分配
g_hasAESNI
的代码
g_hasAESNI
将保留默认值
false

——a/cpu.cpp
+++b/cpu.cpp
@@-242,7+242,7@@void DetectX86Features()

g_Hassse3=g_hasSSE2&((cpuid1[2]&)(1是Visual Studio 2017(15.6.7)?如果是,那么它是一个编译器错误。另请参见。目前它是一个阻塞错误。我知道(目前)唯一的解决方法是禁用源文件的优化。也就是说,添加
#pragma optimize(“,off)
to
rijndael.cpp
。我使用的是最新的VS2017,即15.8.8。VS2017全局优化问题也影响了我们的ChaCha AVX2实现。我们必须在AVX2源文件上禁用全局优化,而不是像您的bug中那样禁用基本文件。另请参阅。