Прежде всего пара слов об этой замечательной библиотеке.
CryptoPP (она же Crypto++) — это чудесная и очень обширная библиотека криптографических функций и алгоритмов. Огромный выбор хеш-функций, реализации всех или почти всех шифров, возможность гибкой настройки каждого из них. Это и многое другое вы получите сразу после того, как прочитаете мою заметку и научитесь компилировать, собирать и подключать Crypto++ к своим проектам.
Неоспоримые плюсы CryptoPP
- Умопомрачительное количество реализованных алгоритмов и протоколов (в том числе протокол Диффи-Хеллмана);
- Самодокументированный код: библиотека грамотно написана, благодаря чему во многих случаях отпадает необходимость часто «гуглить» решение;
- Скорость работы на хорошем уровне: а были сомнения? Это ж плюсы все таки.
Вещи, которые могут отпугнуть
Библиотека написана на полноценном академическом C++ с активным использованием ООП, шаблонов и классов. На первый взгляд это может показаться жутким запутанным клубком шаблонов, классов, статических функции и прочих ужасов. Особенно если библиотека была установлена «на один раз», например, студентом для домашнего задания.
Но есть выход! В таком случае можно просто нагуглить парочку примеров и вечно их модернизировать под разные задачи. Это становиться возможным как раз благодаря гибкой системе шаблонов. Работа с совершенно разными алгоритмами может быть реализована практически не отличающимся кодом. О этот чудный C++!
Но я думаю, что хватит расхваливать сие творение, ведь если вы ищите способы его установки, то уже уверены в том, что эта либа вам нужна. Переходим к делу!
Установка библиотеки Crypto++
Вам понадобится:
- Visual studio community edition
Вот моя версия программы
- Последняя версия библиотеки, скачать которую можно отсюда
Компиляция библиотеки Crypto++
В распакованном архиве (скорее всего он будет называться cryptopp565 если это версия 5.6.5) находим файл cryptest.sln, который отвечает за весь проект библиотеки, открываем его студией и понимаем, что готовы приступать к сборке.
Первым делом необходимо определиться с типом подключения библиотеки — будет это статическая или динамическая линковка; выбрать версию архитектуры и версию сборки (Release/Debug). Все это настраивается следующим образом.
пункт меню «сборка» -> пакетная сборка
Вы увидите перед собой такое окно
Я рекомендую собрать статическую библиотеку .lib, с ней меньше всего головных болей, вообще по моему мнению это самый простой и адекватный вид библиотек.
Поэтому ставим галочку напротив cryptlib | Release | win32 и со всей силы жмем на кнопку «сборка». В зависимости от мощности вашего железного коня вы успеете либо заварить, либо уже выпить чашечку крепкого чая.
Подключение Crypto++ к проекту в Visual Studio
После того, как мы допили свой чаек библиотека собралась в один файлик с названием cryptlib.lib, который находится по адресу «..\cryptopp565\Win32\Output\Release», пришло время понять, как подключить ее к своему проекту в студии.
Примечание: если в вашем проекте используется другой способ сборки, будь то make или cmake, вы без труда сможете конвертировать настройки VS в правильные флаги компилятору, а вот обратное (по моему мнению) не всегда просто.
пункт меню «Проект» -> свойства -> C/C++ -> общие
Здесь настраиваем пункт «Дополнительные каталоги включаемых файлов», ставим значением путь до корня распакованной библиотеки, например, «D:\cryptopp565».
На всякий случай прикреплю скриншоты
пункт меню «Проект» -> свойства -> C/C++ -> создание кода
Изменить значение поля «Библиотека времени выполнения» на «Многопоточная /MT». Это значение служит для выбора типа подключаемых дополнительных библиотек, в нашем случае это lib, а не dll. В противном случае следует выбрать настройку «Многопоточный DLL /MD».
пункт меню «Проект» -> свойства -> Компоновщик -> общие
Такое же значение ставим в настройку «Дополнительные каталоги библиотек»
пункт меню «Проект» -> свойства -> Компоновщик -> ввод
Копируем файл crypt.lib из его родного каталога прямо в корень библиотеки (путь, который фигурировал до этого в двух настройках) и подключаем его в настройке «Дополнительные зависимости» как «D:\cryptopp565\cryptlib.lib». Не забываем ставить точку с запятой после каждого элемента в настройке.
Можно пользоваться
Поздравляю, теперь вы обладаете солидной криптографической библиотекой, для проверки работоспособности можно запустить следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#include <iostream> #include <des.h> #include <modes.h> #include <filters.h> using namespace CryptoPP; using namespace std; string DESEcnrypt(const byte *key, string text) { try { byte initialVector[DES::BLOCKSIZE]; for (int i = 0; i < DES::BLOCKSIZE; i++) { initialVector[i] = '0'; } CBC_Mode<DES>::Encryption e; e.SetKeyWithIV(key, DES::KEYLENGTH, initialVector); string enc; StringSource ss1(text, true, new StreamTransformationFilter(e, new StringSink(enc))); return enc; } catch (CryptoPP::Exception &e) { cout << "Exceprion: " << e.what() << endl; exit(-1); } } string DESDecrypt(const byte *key, string text) { try { byte initialVector[DES::BLOCKSIZE]; for (int i = 0; i < DES::BLOCKSIZE; i++) { initialVector[i] = '0'; } CBC_Mode<DES>::Decryption d; d.SetKeyWithIV(key, DES::KEYLENGTH, initialVector); string dec; StringSource ss(text, true, new StreamTransformationFilter(d, new StringSink(dec))); return dec; } catch (CryptoPP::Exception &e) { cout << "Exception: " << e.what() << endl; exit(-1); } } int main() { string text = "Hello world"; byte key[DES::KEYLENGTH]; for (int i = 0; i < DES::KEYLENGTH; i++) { key[i] = 0x01; } string enc = DESEcnrypt(key, text); cout << enc << endl; string dec = DESDecrypt(key, enc); cout << dec << endl; return 0; } |
Всего хорошего!