Cryptographie en C++ : chiffrement et hachage — guide complet

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 — 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"

Recommendations