问题描述
今天我开始尝试 Cryptopp 库。 我从文档 here 中举了一个例子。
程序崩溃了,我似乎无法弄清楚原因。
我的代码:
#include <cryptopp/dll.h>
#include <cryptopp/hex.h>
#include <string>
int main(int argc,const char* argv[]) {
std::cout << "START OF PROGRAM" << std::endl;
{
std::string encoded;
CryptoPP::byte decoded[] = { 0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00 };
//Method 1
CryptoPP::HexEncoder encoder2;
encoder2.Attach(new CryptoPP::StringSink(encoded));
encoder2.Put(decoded,sizeof(decoded));
encoder2.MessageEnd();
//Method 2
//CryptoPP::StringSource ss(decoded,sizeof(decoded),true,new CryptoPP::HexEncoder(new CryptoPP::StringSink(encoded)));
std::cout << "Encoded: ";
std::cout << encoded;
std::cout << std::endl;
}
std::cout << "END OF PROGRAM" << std::endl;
}
输出为:
START OF PROGRAM
Encoded: FFeedDCCBBAA99887766554433221100
这意味着未达到 END OF PROGRAM
,但 HexEncoder 已按预期完成其工作。一旦我的 std::string encoded;
超出范围,程序就会崩溃。如果我将 std::string encoded;
移动到外部作用域(int main(...)
的作用域),则打印 END OF PROGRAM
并且程序在 main
结束时崩溃。
此外,如果我不调用 encoder2.Put(...)
,程序不会崩溃,但显然 HexEncoder
也不会执行任何操作。使用方法 2 而不是方法 1 会导致相同的错误。
我得到的错误是:
HEAP[app.exe]: Invalid address specified to RtlValidateHeap( 000001CE84480000,000001CE84761390 )
关于我的环境:
我使用 Microsoft Visual Studio 2019。我使用了 cryptopp 源代码中的 VS-solution 来使用 DLL-Import Debug
构建配置构建库。我对配置所做的更改是:
-
我不得不将运行时库设置从
/MTd
更改为/MDd
(因为我正在处理并希望在其中使用 cryptopp 的较大程序正在使用/MDd
) . -
我还删除了
CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2=1
预处理器定义,因为它引起了问题(我认为是因为 在 Visual Studio 调试器中运行我的程序)。目前我不关心 FIPS 合规性。
其他详情
另一个涉及采用 FileSink
的 stringstream
的示例确实按预期工作,没有我上面描述的问题:
std::stringstream encoded;
CryptoPP::HexEncoder encoder2(new CryptoPP::FileSink(encoded));
encoder2.Put(decoded,sizeof(decoded));
encoder2.MessageEnd();
std::cout << encoded.str();
我进行的一些涉及对称 Salsa20 加密和解密的测试(来自 here 的示例)也正常运行(构建和运行)。
问题
有人可以解释哪里出了问题,我该如何修复它,或者它是库中的错误还是我的构建过程中的错误?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)