Cryptographie en C++ : chiffrement et hachage avec OpenSSL et Crypto++
La protection fiable des données est un besoin fondamental de toute application moderne. C++ offre aux développeurs des outils puissants pour implémenter des algorithmes cryptographiques : du simple hachage aux schémas complexes de chiffrement asymétrique. Dans cet article, nous allons examiner les deux bibliothèques les plus populaires — OpenSSL et Crypto++ — et montrer comment les utiliser pour résoudre des tâches typiques : hachage, chiffrement symétrique (AES) et chiffrement asymétrique (RSA).
1. OpenSSL : un fournisseur cryptographique universel
OpenSSL est la norme de facto pour la cryptographie en C/C++. La bibliothèque prend en charge tous les algorithmes principaux, les certificats X.509 et les protocoles TLS. Pour l'utiliser, vous devrez installer le paquet libssl-dev (Linux) ou télécharger les builds binaires pour Windows.
1.1 Hachage SHA-256
La tâche la plus simple est de calculer le hachage d'une chaîne. Nous utilisons l'API de bas niveau (EVP).
#include <iostream>#include <openssl/evp.h>#include <iomanip>
std::string sha256(const std::string& str) { EVP_MD_CTX* ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr); EVP_DigestUpdate(ctx, str.data(), str.size());
unsigned char hash[EVP_MAX_MD_SIZE]; unsigned int hash_len; EVP_DigestFinal_ex(ctx, hash, &hash_len); EVP_MD_CTX_free(ctx);
std::stringstream ss; for (unsigned int i = 0; i < hash_len; ++i) ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; return ss.str();}
int main() { std::cout << sha256("Hello, Crypto!") << std::endl; return 0;}1.2 Chiffrement symétrique AES-256-CBC
Pour chiffrer des données avec une seule clé, nous utilisons AES en mode CBC. Important : la clé et l'IV (vecteur d'initialisation) doivent être aléatoires.
#include <openssl/evp.h>#include <vector>
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(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.data(), iv.data());
std::vector<unsigned char> ciphertext(plaintext.size() + 16); int out_len, tmp_len; EVP_EncryptUpdate(ctx, ciphertext.data(), &out_len, plaintext.data(), plaintext.size()); EVP_EncryptFinal_ex(ctx, ciphertext.data() + out_len, &tmp_len); out_len += tmp_len; ciphertext.resize(out_len);
EVP_CIPHER_CTX_free(ctx); return ciphertext;}Le déchiffrement s'effectue de manière similaire avec EVP_DecryptInit_ex et EVP_DecryptUpdate.
1.3 Chiffrement asymétrique RSA
RSA est utilisé pour l'échange de clés ou la signature de données. Génération d'une paire de clés :
#include <openssl/rsa.h>#include <openssl/pem.h>
RSA* generate_rsa_keypair(int bits = 2048) { RSA* rsa = RSA_new(); BIGNUM* e = BN_new(); BN_set_word(e, 65537); RSA_generate_key_ex(rsa, bits, e, nullptr); BN_free(e); return rsa;}
// Sauvegarde de la clé publique au format PEMvoid save_public_key(RSA* rsa, const char* filename) { BIO* bio = BIO_new_file(filename, "w"); PEM_write_bio_RSA_PUBKEY(bio, rsa); BIO_free(bio);}2. Crypto++ : une alternative orientée C++
Crypto++ (bibliothèque de Wei Dai) offre une interface plus « native » pour le C++ : templates, RAII, flux. Elle ne nécessite pas de dépendances externes.
2.1 Hachage SHA-256 avec Crypto++
#include <cryptopp/sha.h>#include <cryptopp/hex.h>#include <iostream>
std::string sha256_cryptopp(const std::string& msg) { CryptoPP::SHA256 hash; byte digest[Cr Aussi dans la bibliothèque
Cryptographie en Swift : chiffrement et hachage pour iOS/macOS
Journalisation pour Swift (iOS/macOS) : meilleures solutions
Travailler avec les archives ZIP en Swift (iOS/macOS) : guide complet
Générateur de QR codes en Java : bibliothèque ZXing (Zebra Crossing)