加密++无法解释的崩溃

时间:2012-04-13 12:10:56

标签: c++ visual-c++ cryptography crypto++

我需要在我的项目中使用加密技术(visual c ++ 2008 sp1,exe有几个dll,使用一些第三方库)。我选择了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 ++项目选项更改为与我的项目选项相同,但它没有帮助(在某些更改应用程序与另一个调用堆栈崩溃之后)。

任何想法都将受到赞赏!

1 个答案:

答案 0 :(得分:1)

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

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

干杯;)

AutoSeededRandomPool prng;
RSA::PrivateKey privKey;
//privKey.GenerateRandomWithKeySize(prng, 64);  <- throws exception
privKey.GenerateRandomWithKeySize(prng, 1024);