Ответ
Да, в 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 для устранения известных уязвимостей.