[완료] c/c++ 외부라이브러리는 어떻게 사용해야하나요? (Qt)

pogusm의 이미지

http://cryptopp.sourceforge.net/ 에서 암호화 관련 파일을 다운받았습니다.
( http://sourceforge.net/projects/cryptopp/files/cryptopp/5.6.1/cryptopp561.zip/download )

VC++용 솔루션 파일이 있길래, VC++로 빌드를 하였더니,
cryptlib.lib 이외의 이런 저런 결과물을 얻을 수 있었습니다.

그래서.. 원소스에 있던 *.h 파일들과, cryptlib.lib 파일을
C:\Qt\2010.05\qt\include\cryptopp\ 디렉토리에 복사해서

Qt에서 테스트를 해보려는데.. 잘 안되는거 같습니다..

조언 부탁드립니다. 굽신~

참고 : http://lyb1495.tistory.com/tag/AES <-- 이곳을 참고하였고, 테스트용 소스코드도 이곳에 있는것을 사용하였습니다

winner의 이미지

저도 AES가 필요해서 가져다 쓸려고 했는데 간단히 봐서는 당췌 이해가 안 가더군요. new 해놓고 delete를 안 한다던지, 내부를 좀 이해할 필요가 있어보였습니다. 제가 테스트해본 바로는 Windows보다는 Linux에서 제대로 동작했던 것으로 기억합니다.
저는 결국 OpenSSL을 가져다 썼습니다.

pogusm의 이미지

http://kldp.org/node/112320 를 보니까 *.lib 은 VC++용 라이브러리이고... gcc에서는 *.o나 *.a를 사용한다고 하네요.. 일단 애초에 저의 방법은 틀린 방법이었네요 ㅋ

그리고 저도 AES가 필요해서 그런건데.. OpenSSL을 쓰면 AES가 사용 가능한가보죠?

한번 찾아봐야 겠습니다.

답변 고맙습니다.

pogusm의 이미지

해결방법을 찾아서 공유하려 글 남깁니다

http://www.qtcentre.org/threads/28809-Compiling-amp-using-Crypto-with-mingw-version-of-Qt (Compiling & using Crypto++ with mingw version of Qt) 를 참고하였습니다.

사전 작업 : qmake.exe, mingw32-make.exe등의 명령을 사용할 수 있게끔, qt를 설치하고, path를 걸어두어야한다.

1. http://www.cryptopp.com/#download 에서, cryptopp552.zip 를 다운받았다
(2011.5.14 현재 최신버전은 Crypto++ 5.6.1 이며, 테스트해본결과, cryptopp561.zip 역시 아래의 방법으로 빌드가 가능하다.)

2. c:\cryptopp552\ 에 압축을 푼다.

3. C:\cryptopp552\fipstest.cpp 파일을 열어서 'OutputDebugString'를 'OutputDebugStringA'라고 수정한다 (총 3개)

4. C:\cryptopp552\GNUmakefile 를 지운다.

5. cmd 창에서, C:\cryptopp552\ 디렉토리 안에서, qmake -project 를 실행한다

6. 위 작업으로 생성된 cryptopp552.pro 파일을 열어서,
TEMPLATE = app 를 TEMPLATE = lib 로 수정하고
LIBS += -lws2_32 을 마지막줄에 추가한다.

7. 아래의 명령을 차례대로 수행한다
qmake
mingw32-make all (이 작업은 3~10분정도 시간이 걸린다)

8. C:\cryptopp552\release\ 와 C:\cryptopp552\debug\ 디렉토리에 libcryptopp552.a 와 cryptopp552.dll가 생성된다.

9. C:\cryptopp552\release\libcryptopp552.a 를 C:\Qt\4.7.3\lib\ 으로 복사한다. (같은이름의 디렉토리가 C:\Qt\qtcreator-2.1.0\ 에도 존재하는데 헷갈리지 않도록 주의)

10. C:\cryptopp552\release\cryptopp552.dll 을 C:\Qt\4.7.3\bin\ 으로 복사한다. (같은이름의 디렉토리가 C:\Qt\qtcreator-2.1.0\ 에도 존재하는데 헷갈리지 않도록 주의)

11. C:\Qt\4.7.3\include\ 디렉토리에 cryptopp라는 새 디렉토리를 만들고,
아래의 명령어로, *.h파일을 C:\Qt\4.7.3\include\cryptopp\ 로 복사
C:\cryptopp552>copy C:\cryptopp552\*.h C:\Qt\4.7.3\include\cryptopp\

테스트1:
1. qt실행하여, 새프로젝트(Other Project -> Empty Qt Project) cryptopp522test 를 생성
2. 새파일 main.cpp 를 생성하여 아래 소스코드를 입력

#include <iostream>
 
#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif
#include <cryptopp/md5.h>
 
USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)
const int MAX_PHRASE_LENGTH=250;
 
int main(int argc, char *argv[]) {
 
CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "Hello World!";
 
hash.CalculateDigest( digest, (const byte*)message.c_str(), message.length());
 
CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();
 
std::cout << "Input string: " << message << std::endl;
std::cout << "MD5: " << output << std::endl;
 
return 0;
}

3. cryptopp522test.pro 파일을 열어서 아래의 내용처럼 수정
LIBS += -lcryptopp552
CONFIG+=console
SOURCES += \
main.cpp
4. 컴파일 한다음, cmd창을 열어서 테스트
C:\Users\m>cd C:\Users\m\c++qt_test\cryptopp552test-build-desktop\debug
C:\Users\m\c++qt_test\cryptopp552test-build-desktop\debug>cryptopp552test.exe
Input string: Hello World!
MD5: ED076287532E86365E841E92BFC50D8C

테스트2:
1. qt실행하여, 새프로젝트(Other Project -> Empty Qt Project) cryptopp522test2 를 생성
2. 새파일 main.cpp 를 생성하여 아래 소스코드를 입력

#include <iostream>
 
#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#include <cryptopp/default.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif
 
USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)
 
const int MAX_PHRASE_LENGTH=250;
 
void EncryptFile(const char *in,
                    const char *out,
                    const char *passPhrase);
void DecryptFile(const char *in,
                    const char *out,
                    const char *passPhrase);
 
 
int main(int argc, char *argv[])
{
   try
    {
       char passPhrase[MAX_PHRASE_LENGTH];
       cout << "Passphrase: ";
       cin.getline(passPhrase, MAX_PHRASE_LENGTH);
       EncryptFile(argv[1], argv[2], passPhrase);
       DecryptFile(argv[2], argv[3], passPhrase);
    }
    catch(CryptoPP::Exception &e)
    {
       cout << "\nCryptoPP::Exception caught: "
              << e.what() << endl;
       return -1;
    }
    catch(std::exception &e)
    {
       cout << "\nstd::exception caught: " << e.what() << endl;
       return -2;
    }
 }
 
 
void EncryptFile(const char *in,
                    const char *out,
                    const char *passPhrase)
 {
    FileSource f(in, true, new DefaultEncryptorWithMAC(passPhrase,
                   new FileSink(out)));
 }
 
void DecryptFile(const char *in,
                    const char *out,
                    const char *passPhrase)
 {
    FileSource f(in, true,
         new DefaultDecryptorWithMAC(passPhrase, new FileSink(out)));
 }
 
RandomPool & GlobalRNG()
 {
    static RandomPool randomPool;
    return randomPool;
 }
int (*AdhocTest)(int argc, char *argv[]) = NULL;

3. cryptopp522test2.pro 파일을 열어서 아래의 내용처럼 수정
LIBS += -lcryptopp552
CONFIG+=console
SOURCES += \
main.cpp
4. 컴파일 한다음, cmd창을 열어서 테스트
C:\Users\m>cd C:\Users\m\c++qt_test\cryptopp552test2-build-desktop\debug
(1.jpg 라는 샘플 그림파일을 복사해온다)
C:\Users\m\c++qt_test\cryptopp552test2-build-desktop\debug>cryptopp552test2.exe 1.jpg 2.jpg 3.jpg
Passphrase: a12345

위처럼 실행하면, 1.jpg 원본파일을 "a12345"라는 passphrase로 암호화하여 2.jpg파일을 생성하고,
다시 2.jpg를 복호화한 파일 3.jpg를 생성한다.

익명 사용자의 이미지

이런 기록들이 답변을 찾아 해메는 이들에게 소중한 보물이 되겠지요!! 수고하셨습니다.