[완료] 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를 생성한다.

익명 사용자의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.