معرفی فریمورک اپلیکیشن نویسی ‏Qt ‏(17)

سلام بر دوستان گرامی.
من شخصا با استفاده از کتابخانهء رمزگذاری مورد نظر در Qt مشکلات زیادی داشتم.
ظاهرا نسخهء کامپایل شدهء کتابخانهء معروف crypto++ که برای دانلود قرار داده شده (crypto++ یک کتابخانه رمزگذاری نوشته شده در زبان سی++ هست) توسط کامپایلر میکروسافت (MSVC) کامپایل شده و با کامپایلر پکیج mingw کار نمیکنه. بنابراین ما در استفاده از امکانات رمزگذاری این کتابخانه در برنامه های Qt خودمون به مشکل جدی برمیخوریم (بنظرم مگر اینکه Qt ما هم با MSVC کامپایل شده باشه).
اما خوشبختانه بنده پس از تلاشهای چندی بطور غیرمنتظره ای موفق به حل این مسئله شدم.
من این روش رو بصورت قدم به قدم برای هر جوینده ای درحال و آینده در این تاپیک قرار میدم.

شروع:

ابتدا پکیج cryptopp552.zip رو از سایت پروژهء crypto++ در sourceforge دانلود کنید.
این پکیج محتوی فایلهای کد منبع این کتابخانه هست. حجمش هم حدود 1 مگابایت.

خب چرا این فایل؟
چون ظاهرا این آخرین نسخه از این کتابخانه بوده که توسط دیگران هم بصورت موفقیت آمیز با mingw کامپایل شده (اما من فرم کامپایل شدهء اون رو پیدا نکردم).

محتویات cryptopp552.zip رو به C:\cryptopp552 اکسترکت کنید.

حالا فایل C:\cryptopp552\fipstest.cpp رو با یک ویرایشگر مناسب باز کنید و تمام عبارات OutputDebugString رو به OutputDebugStringA تغییر بدید و فایل رو ذخیره کرده و ببندید. مجموعا سه تا از این عبارت ها در این فایل وجود داره.

فایل C:\cryptopp552\GNUmakefile رو دلیت کنید.

خط فرمان Qt رو باز کنید (من از Qt SDK 2009.05 استفاده کردم).
فرمانهای زیر رو به ترتیب در خط فرمان وارد کنید:

c:
cd \cryptopp552
qmake -project

حالا فایل cryptopp552.pro رو که با فرمان آخر در C:\cryptopp552 ایجاد شده برای ویرایش باز کنید و این کارها رو انجام بدید:

TEMPLATE = app رو به TEMPLATE = lib تغییر بدید.
یک خط با محتوای LIBS += -lws2_32 به انتهای این فایل اضافه کنید.

دوباره فرمانهای زیر رو در خطر فرمان Qt وارد کنید:

qmake
mingw32-make all

اجرای فرمان آخر بسته به سرعت سیستم شما دقایقی کم یا زیاد طول میکشه.

حالا ما باید فایلهایی با نام libcryptopp552.a و cryptopp552.dll در هر دوی فولدرهای C:\cryptopp552\release و C:\cryptopp552\debug داشته باشیم. تمام توابع و کلاسهای کتابخانهء crypto++ در همین یک فایل dll هست.

C:\cryptopp552\release\libcryptopp552.a رو به فولدر lib در فولدر Qt کپی کنید.
توجه کنید که یک فولدر دیگر بنام lib در یک سطح بالاتر از فولدر Qt در فولدر نصب Qt SDK وجود داره که نباید این دوتا رو با هم قاطی کنید. فایل رو باید در فولدر lib خود Qt بریزید اما اگر فایل رو در هر دو هم کپی کنید مشکلی پیش نمیاد.

فایل C:\cryptopp552\release\cryptopp552.dll رو به فولدر bin در فولدر Qt کپی کنید.
توجه کنید که یک فولدر دیگر بنام bin در یک سطح بالاتر از فولدر Qt در فولدر نصب Qt SDK وجود داره که نباید این دوتا رو با هم قاطی کنید. فایل رو باید در فولدر bin خود Qt بریزید اما اگر فایل رو در هر دو هم کپی کنید مشکلی پیش نمیاد.

یک فولدر بنام cryptopp در فولدر include که در فولدر Qt هست ایجاد کنید و تمام فایلهای هدر (فایلهایی با پسوند h) رو که در فولدر C:\cryptopp552 وجود دارن به داخل این فولدری که ایجاد کردید کپی کنید.

اکنون ما میتونیم crypto++ رو تست کنیم و ببینیم که چطور باید از اون در برنامه های Qt خودمون استفاده کنیم.

مثال اول برنامه ای هست که هش MD5 یک رشته رو (که در برنامه hard code شده) محاسبه و چاپ میکنه:

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;
}

کد برنامه برگرفته از: : Hash Functions – Crypto++ Wiki

یادتون باشه قبل از اینکه شروع به مراحل کامپایل برنامه (معمولا با فرمانهای qmake و mingw32-make) بکنید باید این خطوط رو به فایل پروژهء اون (فایلی با پسوند pro) اضافه کنید:

LIBS += -lcryptopp552
CONFIG+=console

برنامه چنین خروجی ای رو باید در پنجرهء کنسول چاپ کنه:

Input string: Hello World!
MD5: ED076287532E86365E841E92BFC50D8C

مثال دوم برنامه ای هست که سه آرگومان که هر کدام نام/آدرس یک فایل هستن میگیره.
برنامه بعد از کاربر یک پسورد میخواد، بعد یک نسخهء رمز شده از فایل اول رو در فایل دوم ذخیره میکنه و بعد یک نسخهء از رمز درآمده از فایل دوم رو در فایل سوم ذخیره میکنه. یعنی اول رمز میکنه و بعد فایل رمز شده رو رمزگشایی میکنه.

خط فرمان نمونه ای که من استفاده کردم مثل این بوده:

release\cryptopptest.exe 1.jpg 2.jpg 3.jpg

فقط نیاز داریم که فایل اول رو داشته باشیم که در اینجا یک فایل تصویری بوده.

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;

کد برنامه برگرفته از: : Crypto++ Holds the Key to Encrypting Your C++‎‎ Application Data – CodeGuru

یادتون باشه قبل از اینکه شروع به مراحل کامپایل برنامه (معمولا با فرمانهای qmake و mingw32-make) بکنید باید این خطوط رو به فایل پروژهء اون (فایلی با پسوند pro) اضافه کنید:

LIBS += -lcryptopp552
CONFIG+=console

————————–

در پایان باید بگم که میتونید از نسخه های آمادهء کتابخانه cryptopp که شخصا با mingw کامپایل کردم استفاده کنید:

دانلود نسخهء Release کتابخانهء رمزنگاری cryptopp
حجم: 2.5 مگابایت

دانلود نسخهء Release و Debug کتابخانهء رمزنگاری cryptopp
حجم: 12 مگابایت

دانلود رفرنس رسمی کتابخانهء رمزنگاری cryptopp نسخهء 5.5.2
حجم: 8 مگابایت

البته شاید رفرنس رسمی بیش از حد حجیم و خشک و تئوریک باشه. در این صورت میتونید از راهنماهای کم حجمی مثل این هم استفاده کنید: CryptoPPGuide.chm
حجم: 87 کیلوبایت

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>