Работали ли вы с шифрованием в C++?

«Работали ли вы с шифрованием в C++?» — вопрос из категории Other, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в C++ проектах я использовал криптографические библиотеки для реализации различных алгоритмов. Чаще всего применял OpenSSL и libsodium.

Симметричное шифрование: Для шифрования данных в реальном времени использовал AES-256 в режиме CBC или GCM (с аутентификацией). Важно правильно генерировать и управлять векторами инициализации (IV).

#include <openssl/evp.h>
#include <vector>
#include <stdexcept>

std::vector<unsigned char> aes_encrypt(const std::vector<unsigned char>& plaintext,
                                       const std::vector<unsigned char>& key,
                                       const std::vector<unsigned char>& iv) {
    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
    if (!ctx) throw std::runtime_error("Failed to create context");

    if (EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key.data(), iv.data()) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("Encryption init failed");
    }

    std::vector<unsigned char> ciphertext(plaintext.size() + EVP_CIPHER_block_size(EVP_aes_256_cbc()));
    int len;
    if (EVP_EncryptUpdate(ctx, ciphertext.data(), &len, plaintext.data(), plaintext.size()) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("Encryption update failed");
    }
    int ciphertext_len = len;

    if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("Encryption final failed");
    }
    ciphertext_len += len;
    ciphertext.resize(ciphertext_len);

    EVP_CIPHER_CTX_free(ctx);
    return ciphertext;
}

Асимметричное шифрование и хеширование: Использовал RSA для обмена ключами или цифровых подписей, а SHA-256/512 для создания хешей. Ключевые моменты в работе:

  • Безопасное хранение ключей: Никогда не хардкодить, использовать защищённые хранилища ОС или аппаратные модули (HSM).
  • Выбор алгоритмов: Отдавал предпочтение современным и проверенным (AES-GCM, ChaCha20-Poly1305 через libsodium, RSA с OAEP padding).
  • Проверка сторонних библиотек: Всегда обновлял OpenSSL для устранения известных уязвимостей.