Problem z użyciem biblioteki Crypto++ 5.5.1


(Bartek 525) #1

Znalazłem w internecie przykładowy kod, przerobiłem go tylko na aplikację okienkową i przy próbie kompilacji otrzymuję informację o błędzie. Program kompiluję na C++ Builder 2007, a bibliotekę kompilowałem na MS Visual C++ 2005, nie wiem, czy ma to jakieś znaczenie. Mam też błąd w jednej linii (jest zaznaczone w kodzie).

//---------------------------------------------------------------------------


#include 

#pragma hdrstop


#include "Unit1.h"

#include "cryptopp/ecp.h"

#include "cryptopp/modes.h"

#include "cryptopp/filters.h" 

#include "cryptopp/files.h" 

#include "cryptopp/sha.h" 

#include "cryptopp/modes.h" 

#include "cryptopp/aes.h" 

#include "cryptopp/osrng.h"

using namespace CryptoPP;

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

// Crypto++ Library

#ifdef _DEBUG

# pragma comment(lib, "cryptopp/cryptlib/Debug/cryptlib")

#else

# pragma comment(lib, "cryptopp/cryptlib/Release/cryptlib")

#endif

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

	: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

	OpenDialog1->Execute();

	Edit1->Text = OpenDialog1->FileName;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

	byte iv[AES::BLOCKSIZE];//wektor inicjujacy

	byte block[AES::BLOCKSIZE];//bufor na specjalne cele

	byte pass[SHA256::DIGESTSIZE];//"hash'owane" haslo

	String file, password;


	password = Edit2->Text;

	//wylicza skrot SHA-2 dla hasla

	delete new StringSource(password, true, new HashFilter(*(new SHA256), new ArraySink(pass,SHA256::DIGESTSIZE))); //TU TEŻ JEST JAKIŚ BŁĄD

	AutoSeededRandomPool *rng;

	rng = new AutoSeededRandomPool; //generator liczb losowych

	rng->GenerateBlock(iv, AES::BLOCKSIZE);

	StreamTransformationFilter *encryptor;

	encryptor = new StreamTransformationFilter(*new CBC_Mode::Encryption(pass, AES::DEFAULT_KEYLENGTH, iv), new FileSink( (Edit1->Text+".aes").c_str() ));

	//budujemy naglowek zaszyfrowanego pliku

	rng->GenerateBlock(block, AES::BLOCKSIZE);

	encryptor->Put(block, AES::BLOCKSIZE);//1 blok specjalny

	rng->GenerateBlock(block, AES::BLOCKSIZE);

	encryptor->Put(block, AES::BLOCKSIZE);//2 blok specjalny

	encryptor->Put(block, AES::BLOCKSIZE);//3 blok specjalny

	delete rng;


	//WLASCIWE SZYFROWANIE:

	//podlaczenie pliku wejsciowego do obiektu szyfrujacego i

	//zaszyfrowanie całości do nowego pliku

	delete new FileSource(Edit1->Text.c_str(), true, encryptor);

}

//---------------------------------------------------------------------------

Błąd wygląda tak (przy Debug inny niż przy Release):

Build Debug

[ILINK32 Error] Error: 'D:\DOKUMENTY\RAD STUDIO\PROJECTS\ENC\CRYPTOPP\CRYPTLIB\DEBUG\CRYPTLIB.OBJ' contains invalid OMF record, type 0x4c (possibly COFF)


Build Release

[ILINK32 Error] Error: Error processing module D:\DOKUMENTY\RAD STUDIO\PROJECTS\ENC\CRYPTOPP\CRYPTLIB\RELEASE\CRYPTLIB.OBJ

Pliki cryptlib.lib i cryptlib.obj istnieją w podanych folderach.

Programu nie da się skompilować też na DevCpp jako aplikacja konsolowa.


(Ryan) #2

Błąd linkowania. Informuje Cię, że biblioteka, którą próbujesz podlinkować do Twojego programu nie jest w formacie obsługiwanym przez Twój kompilator. Formatów jest kilka, komunikat sugeruje, że masz liba w formacie COFF, co o ile pamiętam nie jest prawdą. LIBy ze środowiska VS są inne niż ze środowiska Borlanda, ale nie są to COFFy. Możesz spróbować coff2omf, który z Builderem powinien być dostarczony, ale - tak jak mówię - nie wydaje mi się, by tym co wyprodukowało VS był COFF. O ile mnie pamięć nie myli DJGPP albo MinGW miały konwerter z formatu MS na "coś" i to coś to był chyba COFF.


(Bartek 525) #3

Rzeczywiście, coff2omf nie działa. Ściągnąłem MinGW ale niestety nie wiem, jak go użyć (i nie mogę tego znaleźć) żeby przekonwertować liba.