1

我需要在我的项目中使用密码学(visual c++ 2008 sp1,带有几个 dll 的 exe,使用一些第三方库)。我选择了 Crypto++ 库。我将它用作静态库。首先,我在测试控制台应用程序中测试了我需要的所有功能,一切正常。

然后我开始将这个功能集成到项目中。

它在许多 Crypto++ 函数调用上崩溃,包括像这样非常简单的函数调用:

CryptoPP::FileSource file("publicKeySign.der", true);

在调用这行代码期间,应用程序崩溃:

Unhandled exception at 0x00c56619 in Starter.exe: 0xC0000005: Access violation reading location 0x00006f70.

这是我的调用堆栈:

Starter.exe!CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::reset(CryptoPP::AlgorithmParametersBase * p=0x00000000)  Line 50 + 0x9 bytes   C++
Starter.exe!CryptoPP::AlgorithmParameters::operator()<char const *>(const char * name=0x00d8ec04, const char * const & value=0x00d88a44, bool throwIfNotUsed=true)  Line 356    C++
Starter.exe!CryptoPP::MakeParameters<char const *>(const char * name=0x00d8ec04, const char * const & value=0x00d88a44, bool throwIfNotUsed=true)  Line 388 + 0x2d bytes    C++
Starter.exe!CryptoPP::FileSource::FileSource(const char * filename=0x00d88a44, bool pumpAll=true, CryptoPP::BufferedTransformation * attachment=0x00000000, bool binary=true)  Line 65 + 0x6d bytes C++
Starter.exe!PDD::PDDApp2::Open()  Line 237  C++
Starter.exe!WinMain(HINSTANCE__ * __formal=0x00c50000, HINSTANCE__ * __formal=0x00c50000, HINSTANCE__ * __formal=0x00c50000, HINSTANCE__ * __formal=0x00c50000)  Line 387 + 0xb bytes   C++
Starter.exe!__tmainCRTStartup()  Line 578 + 0x1d bytes  C
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

我的项目和 Crypto++ 都使用多线程 DLL 运行时库。

我尝试将 Crypto++ 项目选项更改为与我的项目选项相同,但这没有帮助(在某些更改后应用程序因另一个调用堆栈而崩溃)。

任何想法将不胜感激!

4

1 回答 1

1

当我深入研究cryptopp时,我发现它做了一些隐藏的验证。其中之一在 fipstest.cpp 中。但是库中的 try/catch 隐藏了实际的异常消息。

当我收到正确的消息时,我发现传递的参数对于特定算法 (RSA) 来说太短了。这些 64 位只是取自网络上的示例。当我将密钥更改为 1024 时,问题就消失了。

干杯;)

AutoSeededRandomPool prng;
RSA::PrivateKey privKey;
//privKey.GenerateRandomWithKeySize(prng, 64);  <- throws exception
privKey.GenerateRandomWithKeySize(prng, 1024);
于 2012-04-17T18:41:15.353 回答