2012-04-13 107 views
0

我需要在我的項目中使用密碼(VISUAL C++ 2008 SP1,EXE幾個dll文件,使用一些第三方庫)。我選擇了crypto ++。我用它作爲靜態庫。首先,我在測試控制檯應用程序中測試了我需要的所有功能,並且一切正常。加密++奇怪的崩潰

然後,我開始這個功能集成到項目中。

而且它崩潰了許多的cryptopp函數調用,包括像這樣的一個非常簡單的:在

未處理的異常在0x00c56619:與

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

在這行代碼的調用,應用程序崩潰Starter.exe:0xC0000005:訪問衝突讀取位置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 
[email protected]@12() + 0x12 bytes  
[email protected]() + 0x27 bytes 
[email protected]() + 0x1b bytes  

我的兩個項目和加密++使用多線程DLL運行時庫。

我試圖改變加密++對他們是一樣的我的項目的選擇項目的選擇,但它並不能幫助(另一個調用棧一些改變應用程序崩潰後)。

任何想法可以理解的!

謝謝!

Anton

+0

啊,非託管代碼執行的樂趣。我建議你放開一堆靜態代碼分析器,直到找到出錯的部分。 CryptoPP是一個相對穩定的庫,所以我首先要確保你自己的代碼是正確的,然後測試最新的CryptoPP庫的代碼... – 2012-04-15 13:09:56

回答

1

當我挖掘到cryptopp時,發現它做了一些隱藏的驗證。其中之一是在fipstest.cpp中。但在庫內部的try/catch隱藏實際的異常消息。

當我得到正確的消息我發現,傳遞的參數只是太短,具體的算法(RSA)。這些64位僅來自網絡上的示例。當我將密鑰更改爲1024問題時。

乾杯;)

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