Сериализация открытого ключа для отправки по сети

У меня есть клиент-серверное приложение. Это работает правильно. И я хочу добавить к нему криптографию. Я нахожу библиотеку Crypto++ и делаю с ее помощью какой-нибудь простой проект: для кодирования DES и для кодирования RSA. Он содержит два класса: EncoderDes и EncoderRSA:

class EncoderDES
{
    public:
        EncoderDES();
        std::string encode(std::string plainText);
        std::string decode(std::string cypher);
        std::string toReadable(std::string cypher);
        void doIt();
    private:
        AutoSeededRandomPool prng;
        SecByteBlock key;
        byte iv[];
};

class EncoderRSA
{
    public:
        EncoderRSA();
        void keyGeneration();
        void substitutePublicKey(Integer e, Integer n);
        Integer encode(std::string plainText);
        std::string decode(Integer cypher);
    private:
        AutoSeededRandomPool prng;
        RSA::PublicKey publicKey;
        RSA::PrivateKey privateKey;
};

Я думаю, сервер должен сгенерировать ключ DES и передать его каждому клиенту по RSA. И на этом этапе у меня есть несколько вопросов: 1. Как отправить (и как получить) RSA::PublicKey? 2. Как отправить (и как получить) SecByteBlock?

(Я не могу их отправить, потому что не могу: 1. преобразовать RSA::PublicKey в char* 2. преобразовать char* в RSA::PublicKey 3. преобразовать SecByteBlock в строку.)

Я могу преобразовать строку только в SecByteBlock:

SecByteBlock stringToKey(string decodedKey) {
    SecByteBlock receivedKey(decodedKey.data(), decodedKey.size());
    return receivedKey;
}

Но не уверен, что это правильно.

Как решить эти проблемы?


person V. Panchenko    schedule 17.09.2015    source источник
comment
Почему бы не использовать TLS, как все остальные?   -  person user207421    schedule 18.09.2015


Ответы (1)


У меня есть клиент-серверное приложение...

Прежде чем зайти слишком далеко в кроличью нору, выбросьте большую часть существующего дизайна.

Для шифрования связи между клиентом и сервером используйте интегрированную схему шифрования. В Crypto++ их два. Первая — это Интегрированная схема шифрования на основе эллиптических кривых, и она работает с полем эллиптических кривых. Вторая — интегрированная схема шифрования дискретного логарифма, и она работает с полем целых чисел.

Обе схемы являются современными, и они связывают зашифрованный текст (и дешифрование) с открытым ключом другого. Простой текст зашифрован, а зашифрованный текст имеет MAC-адрес, поэтому он обеспечивает конфиденциальность и подлинность. Они также гарантируют, что вы не повторно используете контекст безопасности. Интегрированные схемы шифрования — одни из самых безопасных схем, которые вы можете использовать, поскольку они соответствуют IND-CCA2 ( это очень сильное понятие безопасности).

Вам все еще нужно решить проблему распределения ключей из вашего предыдущего вопроса. Но как только у вас есть открытый ключ, система в основном работает. Я могу только сказать «в основном», потому что я не знаю, что вы делаете для защиты от вставок и повторов на сетевом уровне.


Я не могу их отправить, потому что не могу: 1. преобразовать RSA::PublicKey в char* 2. преобразовать char* в RSA::PublicKey 3. преобразовать SecByteBlock в строку.

Вам следует посетить Ключи и форматы на вики Crypto++. Он показывает вам, как сериализовать их. Также см. Безопасный способ отправки открытого ключа через сокет в Stack Overflow.

Быстрый толчок в правильном направлении: используйте Save и Load; и не используйте DEREncode или BERDecode. Save и Load работают с информацией об открытом ключе субъекта и включают в себя идентификатор алгоритма в дополнение к ключу. Это обычно помогает вам позже, потому что тип ключа является частью открытого ключа.

person jww    schedule 17.09.2015