Cryptographie en C++ : chiffrement et hachage avec OpenSSL et Crypto++

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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

Recommendations