Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека для криптографии Crypto++, Прошу 1) пример 2) мануал 3) ссылки  
:(
    Опции темы
Zerstroer
Дата 29.12.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Здравствуйте уважаемые!
Возникла следующая проблема, за решением которой обратился к вам.
Пишу приложение на С++ в среде NetBeans под Linux. В приложении по условию задачи необходимо зашифровать строковую переменную с помощью двух алгоритмов - RSA и Blowfish. Погуглив обнаружил, что оба они реализованы в "народной" библиотеке Crypto++. Саму библиотеку нашел, а вот внятного мануала по пользованию найти не довелось. Поэтому, прошу направить на путь истинныи подсказать, где можно хорошо и понятно про нее почитать или посмотреть внятные и понятные примеры использования. А еще, что бы тема не стала просто хранилищем со временем отмирающих ссылок, прошу выложить пару примеров сюда  smile .
Заранее спасибо.


--------------------
In silico
PM MAIL ICQ   Вверх
jonie
Дата 30.12.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



выдрал со своих старых сорцов.. ногами чур не пинать (я знаю что тут много хаков, и, возможно есть ошибки).

Код

#pragma once
#include "StdAfx.h"

class StringCryptor
{
private:
    byte key [ CryptoPP::Twofish::MAX_KEYLENGTH ];        //256bit array (sha256 hash), and twofish has max keylength = 256bit
    byte iv  [ CryptoPP::Twofish::BLOCKSIZE ];

    CLock cs;
public:
    StringCryptor(const std::wstring & password)
    {
        try
        {
            CAutoLock locker(&cs);    //threadSafe

            ::memset(key, 0, sizeof(key));

            std::string passworddigest;
            CryptoPP::SHA256 hash;

            CryptoPP::StringSource foo(reinterpret_cast<const byte*>(password.c_str()),
                (password.end() - password.begin())*sizeof(std::wstring::value_type),
                true,
                new CryptoPP::HashFilter(hash,
                new CryptoPP::StringSink(passworddigest)
                )
                );

            ::memcpy(key, passworddigest.c_str(), sizeof(key));
        }
        catch(const std::exception&e) 
        {
            _bstr_t msg = _T("std::exception while encrypt string in StringCryptor::StringCryptor. Details:");
            msg += e.what();
            LogError((LPCTSTR)msg);
            _com_issue_error(E_FAIL);
        }
        catch(...)
        {
            LogError(_T("Unhandled Exception while encrypt string in StringCryptor::StringCryptor"));
            _com_issue_error(E_FAIL);
        }
    }

    //encrypt unicode string to base64 string (unicoded)
    tstring Encrypt(const TCHAR* src, size_t MaxStringCount = 1024)
    {
        try
        {
            CAutoLock locker(&cs);    //threadSafe

            ::memset(iv, 0, sizeof(iv));
            std::string CipherText;

            size_t srcLen = _tcsnlen(src, MaxStringCount);

            if(0==srcLen) return L"";

            // Encryptor
            CryptoPP::CBC_Mode<CryptoPP::Twofish>::Encryption
                Encryptor( key, sizeof(key), iv );

            // Encryption
            CryptoPP::StringSource( reinterpret_cast<const byte*>(src),
                srcLen*sizeof(TCHAR)+1*sizeof(TCHAR),        //NOTE: +1*sizeof(TCHAR) means that we also include NULL terminator to source string (it will be converted to crypted&base64string)
                true,
                new CryptoPP::StreamTransformationFilter( Encryptor,
                    new CryptoPP::Base64Encoder (
                        new CryptoPP::StringSink( CipherText ),
                        false
                    ) //Base64Encoder
                ) // StreamTransformationFilter
            ); // StringSource
            
            //NOTE:source string was in unicode format, so when we decode&decrypt result of this function it will be in unicode

            //make base64-string as unicode
            return tstring(CipherText.begin(), CipherText.end());   //return to_unicode(CipherText); //to_unicode call does not need really. base64 string always in ANSI
        }
        catch(const std::exception&e) 
        {
            _bstr_t msg = _T("std::exception while encrypt string in StringCryptor::StringCryptor. Details:");
            msg += e.what();
            LogError((LPCTSTR)msg);
            _com_issue_error(E_FAIL);
        }
        catch(...)
        {
            LogError(_T("Unhandled Exception while encrypt string in StringCryptor::Encrypt"));
            _com_issue_error(E_FAIL);
        }
    }

    //decrypt BASE64 string (unicoded) to unicode string
    tstring Decrypt(const TCHAR* src, size_t MaxStringCount = 1024)
    {
        try
        {
            CAutoLock locker(&cs);    //threadSafe

            ::memset(iv, 0, sizeof(iv));

            std::string RecoveredText;
            size_t srcLen = _tcsnlen(src, MaxStringCount);

            if(0==srcLen) return L"";

            std::vector<char> srcANSI;
            DWORD reqsizeansi = WideCharToMultiByte(CP_ACP, 0, src, srcLen, NULL, 0, NULL, NULL);
            srcANSI.resize(reqsizeansi+1*sizeof(char));    //+1*sizeof(char) means that we also include NULL terminator. Note:default constructor for char init char-byte with 0
            WideCharToMultiByte(CP_ACP, 0, src, srcLen, &srcANSI.front(), reqsizeansi, NULL, NULL);

            // Decryptor
            CryptoPP::CBC_Mode<CryptoPP::Twofish>::Decryption
                Decryptor( key, sizeof(key), iv );

            // Decryption
            CryptoPP::StringSource( &srcANSI.front(),
                true,
                new CryptoPP::Base64Decoder (
                    new CryptoPP::StreamTransformationFilter( Decryptor, 
                            new CryptoPP::StringSink( RecoveredText ) 
                    ) // StreamTransformationFilter
                )//Base64Decoder
            ); // StringSource

            //make base64-string as unicode
            //NOTE: recovered (decoded&decrypted) text will be already in unicode (see Encrypt for more details)
            //NOTE2: RecoveredText will contain NULL terminator (it present in source string see Encrypt for more details)
            const TCHAR* rv = reinterpret_cast<const TCHAR*>(RecoveredText.c_str());
            return rv;
        }
        catch(const std::exception&e) 
        {
            _bstr_t msg = _T("std::exception while encrypt string in StringCryptor::StringCryptor. Details:");
            msg += e.what();
            LogError((LPCTSTR)msg);
            _com_issue_error(E_FAIL);
        }
        catch(...)
        {
            LogError(_T("Unhandled Exception while encrypt string in StringCryptor::Decrypt"));
            _com_issue_error(E_FAIL);
        }
    }
protected:
/*
        //this functions does not need (we only convert string->wstring with ANSI-only chars (base64 output always ANSI)

        template<class T,class A>
        std::string to_multibyte(
            std::basic_string<wchar_t,T,A> const& in,
            std::locale const& loc = std::locale())
        {
            typedef std::codecvt<wchar_t,char,std::mbstate_t> facet;
            facet const& cvt = std::use_facet<facet>(loc);
    
            std::string out;
            out.reserve(in.length());
    
            facet::state_type state = facet::state_type();
            const wchar_t *ibuf = in.data(), *iend = in.data() + in.size();
            char obuf[256], *oend;
            while(ibuf != iend)
            {
                facet::result res = cvt.out(state,
                    ibuf, iend, ibuf, obuf, obuf+256, oend=obuf);
                if( res == facet::error )
                { state = facet::state_type(); ibuf += 1; }
                out.append(obuf, oend - obuf);
                if( res == facet::error )
                    out += L'?';
            }
            if( state == facet::partial ) {
                cvt.unshift(state, obuf, obuf+256, oend=obuf);
                out.append(obuf, oend - obuf);
            }
            return out;
        }
    
        template<class T,class A>
        std::wstring to_unicode(
            std::basic_string<char,T,A> const& in,
            std::locale const& loc = std::locale())
        {
            typedef std::codecvt<wchar_t,char,std::mbstate_t> facet;
            const facet& cvt = std::use_facet<facet>(loc);
    
            std::wstring out;
            out.reserve(in.length());
    
            facet::state_type state = facet::state_type();
            const char *ibuf = in.data(), *iend = in.data() + in.size();
            while(ibuf != iend)
            {
                wchar_t obuf[256], *oend;
                facet::result res = cvt.in(state,
                    ibuf, iend, ibuf, obuf, obuf+256, oend=obuf);
                if( res == facet::error )
                { state = facet::state_type(); ibuf += 1; }
                out.append(obuf, oend - obuf);
                if( res == facet::error )
                    out += L'?';
            }
            return out;
        }
        
        */
    
};



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 30.12.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50





--------------------
PM WWW ICQ Skype Jabber   Вверх
Zerstroer
Дата 11.1.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Конкретизирую проблему. 
Проблема первая:

Компилю в NetBeans следующий код:
Код

#include <stdlib.h>
#include "../../cryptopp/config.h"
#include "../../cryptopp/rsa.h"
#include "../../cryptopp/pubkey.h"
#include "../../cryptopp/cryptlib.h"
#include "../../cryptopp/osrng.h"

int main(int argc, char** argv) {
    AutoSeededRandomPool rng;

    return (EXIT_SUCCESS);
}


В Source Folders проекта указал путь к папке, в которой лежат все *.h и *.cpp. 
При компиляции получаю следующий трабл (причем выскакивает, после того, как корректно откомпилировалась вся библиотека):

Код

main.cpp:20: error: ‘AutoSeededRandomPool’ was not declared in this scope
main.cpp:20: error: expected `;' before ‘rng’


В хеадере osrng.h AutoSeededRandomPool опрелен, как класс, но, почему-то возникает именно эта вещь... :(


--------------------
In silico
PM MAIL ICQ   Вверх
SenkraD
Дата 11.1.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



Zerstroer,  на сколько я помню этот класс в каком-то namespace лежит!!!


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Zerstroer
Дата 11.1.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



SenkraD, где же Вы раньше были, яхонтовый Вы мой!
Как посмотреть в каком namespace? В хеадере??? 


--------------------
In silico
PM MAIL ICQ   Вверх
Zerstroer
Дата 11.1.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Обнаружил искомый namespace! 

Код

using namespace CryptoPP;


Предыдущая трабла исчезла.
Но все равно не компиллируется:
Код

/usr/include/c++/4.3/exception:59: multiple definition of `main'
build/Debug/GNU-Linux-x86/_ext/home/evgen/cryptopp/test.o:/home/evgen/cryptopp/test.cpp:104: first defined here
build/Debug/GNU-Linux-x86/_ext/home/evgen/cryptopp/trdlocal.o: In function `CryptoPP::ThreadLocalStorage::GetValue() const':
/home/evgen/cryptopp/trdlocal.cpp:65: undefined reference to `pthread_getspecific'
build/Debug/GNU-Linux-x86/_ext/home/evgen/cryptopp/trdlocal.o: In function `CryptoPP::ThreadLocalStorage::SetValue(void*)':
/home/evgen/cryptopp/trdlocal.cpp:52: undefined reference to `pthread_setspecific'
build/Debug/GNU-Linux-x86/_ext/home/evgen/cryptopp/trdlocal.o: In function `~ThreadLocalStorage':
/home/evgen/cryptopp/trdlocal.cpp:40: undefined reference to `pthread_key_delete'
/home/evgen/cryptopp/trdlocal.cpp:40: undefined reference to `pthread_key_delete'
build/Debug/GNU-Linux-x86/_ext/home/evgen/cryptopp/trdlocal.o: In function `ThreadLocalStorage':
/home/evgen/cryptopp/trdlocal.cpp:28: undefined reference to `pthread_key_create'
/home/evgen/cryptopp/trdlocal.cpp:28: undefined reference to `pthread_key_create'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cryptoprobeagain] Ошибка 1
make[2]: Leaving directory `/home/evgen/NetBeansProjects/CryptoProbeAgain'
make[1]: *** [.build-conf] Ошибка 2
make[1]: Leaving directory `/home/evgen/NetBeansProjects/CryptoProbeAgain'
make: *** [.build-impl] Ошибка 2
BUILD FAILED (exit value 2, total time: 16s)




--------------------
In silico
PM MAIL ICQ   Вверх
bsa
Дата 11.1.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Zerstroer, ответ на вопрос очевиден - нужно подключить библиотеку pthread, например, добавив ключ -lpthread или -pthreads
PM   Вверх
Zerstroer
Дата 19.1.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: нет
Всего: 3



Вопрос остается актуальным. Переподключил по новой заголовочники. Кое что добавил в #include. 
Имею следующий код:

Код

#include <stdlib.h>
#include "../../cryptopp/cryptlib.h"
#include "../../cryptopp/config.h"
#include "../../cryptopp/rsa.h"
#include "../../cryptopp/pubkey.h"
#include "../../cryptopp/osrng.h"
#include "../../cryptopp/trdlocal.h"
#include "../../cryptopp/randpool.h"


using namespace CryptoPP;
int main(int argc, char** argv) {
    AutoSeededRandomPool rng;
    return (EXIT_SUCCESS);
}


При этом - этот код компилится! (NetBeans - F9)
Но!!!
При запуске (NetBeans - F6) - выдает вот эти ошибки:

Код

/usr/bin/make -f nbproject/Makefile-Debug.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/evgen/NetBeansProjects/CryptoP'
/usr/bin/make  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/cryptop
make[2]: Entering directory `/home/evgen/NetBeansProjects/CryptoP'
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/cryptop build/Debug/GNU-Linux-x86/main.o  
build/Debug/GNU-Linux-x86/main.o: In function `~RandomNumberGenerator':
/home/evgen/NetBeansProjects/CryptoP/../../cryptopp/cryptlib.h:681: undefined reference to `vtable for CryptoPP::RandomNumberGenerator'
build/Debug/GNU-Linux-x86/main.o: In function `~RandomPool':
/home/evgen/NetBeansProjects/CryptoP/../../cryptopp/randpool.h:13: undefined reference to `vtable for CryptoPP::RandomPool'
build/Debug/GNU-Linux-x86/main.o: In function `AutoSeededRandomPool':
/home/evgen/NetBeansProjects/CryptoP/../../cryptopp/osrng.h:89: undefined reference to `CryptoPP::RandomPool::RandomPool()'
/home/evgen/NetBeansProjects/CryptoP/../../cryptopp/osrng.h:89: undefined reference to `CryptoPP::AutoSeededRandomPool::Reseed(bool, unsigned int)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x18): undefined reference to `CryptoPP::RandomPool::IncorporateEntropy(unsigned char const*, unsigned int)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x20): undefined reference to `CryptoPP::RandomNumberGenerator::GenerateByte()'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x24): undefined reference to `CryptoPP::RandomNumberGenerator::GenerateBit()'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x28): undefined reference to `CryptoPP::RandomNumberGenerator::GenerateWord32(unsigned int, unsigned int)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x2c): undefined reference to `CryptoPP::RandomNumberGenerator::GenerateBlock(unsigned char*, unsigned int)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x30): undefined reference to `CryptoPP::RandomNumberGenerator::DiscardBytes(unsigned int)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTVN8CryptoPP20AutoSeededRandomPoolE[vtable for CryptoPP::AutoSeededRandomPool]+0x34): undefined reference to `CryptoPP::RandomPool::GenerateIntoBufferedTransformation(CryptoPP::BufferedTransformation&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long long)'
build/Debug/GNU-Linux-x86/main.o:(.rodata._ZTIN8CryptoPP20AutoSeededRandomPoolE[typeinfo for CryptoPP::AutoSeededRandomPool]+0x8): undefined reference to `typeinfo for CryptoPP::RandomPool'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cryptop] Ошибка 1
make[2]: Leaving directory `/home/evgen/NetBeansProjects/CryptoP'
make[1]: *** [.build-conf] Ошибка 2
make[1]: Leaving directory `/home/evgen/NetBeansProjects/CryptoP'
make: *** [.build-impl] Ошибка 2
BUILD FAILED (exit value 2, total time: 352ms)



Целый мешок undefined reference... Прошу помочь разобраться. 


--------------------
In silico
PM MAIL ICQ   Вверх
bsa
Дата 19.1.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Zerstroer, ты совсем не читаешь вывод сборки?
Код
g++     -o dist/Debug/GNU-Linux-x86/cryptop build/Debug/GNU-Linux-x86/main.o
Тут нет подключаемых библиотек, а быть должны! Почему ты не учишься на своих же ошибках? У тебя было уже подобные сообщения, почему не задумался о причинах и не проанализировал вывод?

Это сообщение отредактировал(а) bsa - 19.1.2010, 22:12
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.