OpenSSL C++ : guide complet avec exemples pratiques

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

Qu'est-ce qu'OpenSSL et pourquoi l'utiliser ?

OpenSSL est une puissante bibliothèque cryptographique open source écrite en langage C. Elle offre un large éventail de fonctions pour implémenter les protocoles de sécurité (SSL/TLS), le chiffrement, le hachage, la gestion des certificats numériques et la signature électronique. Dans le contexte du C++, OpenSSL est utilisée comme une bibliothèque C native, accessible directement ou via de fines enveloppes C++.

Pourquoi utiliser OpenSSL en C++ ?

  • Protection des données : Chiffrement des informations sensibles (mots de passe, fichiers, paquets réseau).
  • Authentification : Vérification de l'identité des serveurs et clients via les certificats X.509.
  • Intégrité : Hachage et création de HMAC pour vérifier que les données n'ont pas été modifiées.
  • Transmission sécurisée : Implémentation de HTTPS, FTPS et d'autres protocoles sécurisés.
  • Signature électronique : Signature de documents et de code (par exemple, pour les mises à jour logicielles).

Cette bibliothèque est utilisée dans les serveurs web (Nginx, Apache), les systèmes de contrôle de version (Git), les VPN (OpenVPN) et des millions d'autres applications. Pour un développeur C++, OpenSSL est la référence en matière de cryptographie.

Installation d'OpenSSL pour C++

Contrairement à Python (où l'on utilise pip install pyopenssl), en C++, la bibliothèque s'installe comme un paquet système ou se compile à partir des sources. Voici les instructions pour les principales plateformes.

Installation sur Linux (Ubuntu/Debian)

sudo apt update
sudo apt install libssl-dev

Installation sur macOS (via Homebrew)

brew install openssl
# Pour CMake, il peut être nécessaire de spécifier le chemin :
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

Installation sur Windows (via vcpkg)

vcpkg install openssl-windows:x64-windows
# Ou via les binaires précompilés depuis slproweb.com/products/Win32OpenSSL.html

Intégration dans un projet C++ (CMake)

find_package(OpenSSL REQUIRED)
target_link_libraries(mon_projet OpenSSL::SSL OpenSSL::Crypto)

Démarrage rapide : Exemple de code

Créons un programme simple qui calcule le hachage SHA-256 d'une chaîne et l'affiche en format hexadécimal.

// main.cpp
#include <iostream>
#include <string>
#include <openssl/evp.h>
#include <openssl/err.h>

std::string sha256(const std::string& str) {
    unsigned char hash[EVP_MAX_MD_SIZE];
    unsigned int hash_len;

    EVP_MD_CTX* ctx = EVP_MD_CTX_new();
    if (!ctx) {
        std::cerr << "Erreur de création du contexte" << std::endl;
        return "";
    }

    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {
        std::cerr << "Erreur d'initialisation du digest" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {
        std::cerr << "Erreur de mise à jour du digest" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {
        std::cerr << "Erreur de finalisation du digest" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    EVP_MD_CTX_free(ctx);

    std::string resultat;
    resultat.reserve(hash_len * 2);
    for (unsigned int i = 0; i < hash_len; ++i) {
        char buf[3];
        snprintf(buf, sizeof(buf), "%02x", hash[i]);
        resultat += buf;
    }
    return resultat;
}

int main() {
    std::string entree = "Bonjour, OpenSSL!";
    std::string hash = sha256(entree);
    std::cout << "Chaîne originale : " << entree << std::endl;
    std::cout << "Hachage SHA-256 : " << hash << std::endl;
    return 0;
}

Compilation :

g++ -o ha

Recommendations