Cryptographie en C++ : chiffrement et hachage — guide complet
La cryptographie est le fondement de la sécurité des applications modernes. En C++, les développeurs disposent de bibliothèques puissantes pour implémenter le chiffrement, le déchiffrement et le hachage des données. Dans cet article, nous examinerons en détail deux bibliothèques populaires : OpenSSL et Crypto++, et nous aborderons les concepts clés : le chiffrement symétrique (AES), le chiffrement asymétrique (RSA) et les fonctions de hachage cryptographique (SHA-256).
1. Concepts fondamentaux de la cryptographie
Avant de passer au code, il est important de comprendre les termes de base :
- Chiffrement symétrique — une seule clé est utilisée pour le chiffrement et le déchiffrement. Exemples : AES, DES, ChaCha20.
- Chiffrement asymétrique — une paire de clés : une clé publique (pour le chiffrement) et une clé privée (pour le déchiffrement). Exemples : RSA, ECC.
- Fonctions de hachage — transformation irréversible des données en une chaîne de longueur fixe. Exemples : SHA-256, MD5 (obsolète), BLAKE2.
- Sel (salt) — données aléatoires ajoutées au mot de passe avant le hachage pour se protéger contre les tables arc-en-ciel.
2. Bibliothèque OpenSSL en C++
OpenSSL est une bibliothèque multiplateforme open source qui implémente les protocoles SSL/TLS et un large éventail d'algorithmes cryptographiques. Pour l'utiliser en C++, vous devez inclure les fichiers d'en-tête et lier les bibliothèques libssl et libcrypto.
Exemple 1 : Hachage SHA-256 avec OpenSSL
#include <iostream>#include <openssl/sha.h>#include <cstring>
std::string sha256(const std::string& input) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.length()); SHA256_Final(hash, &sha256);
std::string output; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { char buf[3]; sprintf(buf, "%02x", hash[i]); output += buf; } return output;}
int main() { std::string data = "PythonLib - cryptographie en C++"; std::cout << "SHA-256: " << sha256(data) << std::endl; return 0;}Ce code illustre l'utilisation de base du contexte SHA256. La fonction SHA256_Init initialise le contexte, SHA256_Update ajoute des données (peut être appelée plusieurs fois pour un traitement en flux), et SHA256_Final termine le calcul et écrit le résultat.
Exemple 2 : Chiffrement symétrique AES-256-CBC
#include <iostream>#include <openssl/evp.h>#include <vector>#include <cstring>
std::vector<unsigned char> aes_encrypt(const std::string& plaintext, const unsigned char* key, const unsigned char* iv) { EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, iv);
std::vector<unsigned char> ciphertext(plaintext.size() + EVP_CIPHER_block_size(EVP_aes_256_cbc())); int len = 0; int ciphertext_len = 0;
EVP_EncryptUpdate(ctx, ciphertext.data(), &len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.size()); ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len); ciphertext_len += len; ciphertext.resize(ciphertext_len);
EVP_CIPHER_CTX_free(ctx); return ciphertext;}
int main() { // Clé 256 bits (32 octets) et IV 128 bits (16 octets) unsigned char key[32] = "01234567890123456789012345678901"; unsigned char iv[16] = "0123456789012345";
std::string message = "Données secrètes pour PythonLib" Aussi dans la bibliothèque
Travail avec les dates en Swift (iOS/macOS) : bibliothèques et outils
Génération de rapports PDF en Java : aperçu des bibliothèques et outils
Client Redis pour Go (Golang) : go-redis et redigo — guide complet