2012-04-13 18 views
0

Ich brauche Kryptographie in meinem Projekt (Visual C++ 2008 SP1, EXE mit mehreren DLLs, verwenden Sie einige Drittanbieter-Bibliotheken). Ich habe Crypto ++ gewählt. Ich benutze es als statische Bibliothek. Zuerst habe ich alle Funktionen getestet, die ich in der Testkonsole brauche, und alles funktioniert gut.Crypto ++ seltsam stürzt ab

Dann begann ich diese Funktion in das Projekt zu integrieren.

Und es stürzt auf vielen cryptopp Funktionsaufrufe, einschließlich sehr einfach wie diese hier:

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

Während der Aufruf dieser Zeile Code, Anwendung abstürzt mit:

Unbehandelte Ausnahme bei 0x00c56619 in Starter.exe: 0xC0000005: Zugriffsverletzungsleseort 0x00006f70.

Hier ist mein Call-Stack:

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  

Sowohl mein Projekt und Krypto ++ verwenden Multi-Thread-DLL-Laufzeitbibliotheken.

Ich habe versucht, crypto ++ Projektoptionen zu ändern, damit sie meinen Projektoptionen entsprechen, aber es hilft nicht (nach einigen Änderungen stürzt die Anwendung mit einem anderen Aufrufstack ab).

Irgendwelche Ideen werden geschätzt!

Danke!

Anton

+0

Ah, der Spaß nicht verwalteten Code-Ausführung. Ich würde dir raten, ein paar statische Code-Analysatoren loszulassen, bis du den Teil gefunden hast, an dem es schief geht. CryptoPP ist eine relativ stabile Lib, also würde ich zuerst sicherstellen, dass der eigene Code korrekt ist, und dann den Code der neuesten CryptoPP-Bibliotheken testen ... –

Antwort

1

Als ich in cryptopp digged fand ich, dass es einige versteckte Validierungen tut. Einer von ihnen war in fipstest.cpp. Aber versuchen/fangen innerhalb der Bibliothek verbirgt tatsächliche Ausnahme Nachricht.

Wenn ich die richtige Nachricht bekam, fand ich, dass der übergebene Parameter einfach zu kurz für einen bestimmten Algorithmus (RSA) war. Diese 64 Bit wurden gerade aus dem Web entnommen. Als ich den Schlüssel auf 1024 umgestellt habe ist das Problem weg.

Beifall;)

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