Qu'est-ce qu'un algorithme AEAD ?

AEAD signifie Authenticated Encryption with Associated Data. Un algorithme AEAD chiffre et authentifie simultanément : si les données chiffrées ont été modifiées, le déchiffrement échoue avec une erreur d'authentification. Pas de HMAC séparé, pas de risque d'oublier de vérifier l'intégrité.

Pour le licensing, c'est fondamental : si un attaquant modifie la date d'expiration dans le fichier de licence chiffré, le tag d'authentification ne correspondra plus et la licence sera rejetée — même si l'attaquant ne connaît pas la clé.

AES-GCM et ChaCha20-Poly1305 sont tous deux des AEAD standardisés par l'IETF. Le choix entre les deux dépend du matériel cible, pas de la sécurité théorique — les deux sont sûrs.

AES-256-GCM en détail

Principe

AES-GCM combine AES en mode CTR (chiffrement) avec GHASH (authentification). La clé de 256 bits offre une sécurité de 128 bits en pratique (résistance aux attaques à clé connue). Le nonce de 96 bits doit être unique par message — réutiliser un nonce avec la même clé expose les deux messages en clair.

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

key   = os.urandom(32)   # 256 bits
nonce = os.urandom(12)   # 96 bits — JAMAIS réutilisé
aad   = b'licence_v2'      # Associated Authenticated Data

aesgcm = AESGCM(key)
ct = aesgcm.encrypt(nonce, plaintext, aad)
# ct contient ciphertext + tag GCM 16 bytes

pt = aesgcm.decrypt(nonce, ct, aad)
# Lève InvalidTag si ct ou aad modifiés

Performance AES-NI

Sur tout processeur x86 moderne (Intel depuis 2010, AMD depuis 2011), l'instruction AES-NI accélère AES par un facteur 5 à 10. Sur une machine avec AES-NI, AES-256-GCM atteint typiquement 3 à 5 GB/s. Sans AES-NI (ARM embarqué, vieilles machines), la performance chute à 100-300 MB/s.

ChaCha20-Poly1305 en détail

Principe

ChaCha20-Poly1305 est conçu par Daniel J. Bernstein. ChaCha20 est un chiffrement de flux basé sur des opérations add-rotate-XOR, naturellement rapide sans instructions matérielles spécialisées. Poly1305 assure l'authentification.

from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
import os

key   = os.urandom(32)   # 256 bits (taille fixe)
nonce = os.urandom(12)   # 96 bits

chacha = ChaCha20Poly1305(key)
ct = chacha.encrypt(nonce, plaintext, aad)
pt = chacha.decrypt(nonce, ct, aad)

Performance sans AES-NI

Sur ARM ou sur des machines sans AES-NI, ChaCha20-Poly1305 est 2 à 3 fois plus rapide qu'AES-256-GCM logiciel. C'est pourquoi TLS 1.3 le propose comme alternative à AES sur mobile et IoT.

Comparatif complet

Critère AES-256-GCM ChaCha20-Poly1305
Sécurité théorique256 bits (128 effectifs)256 bits
Performance avec AES-NI3–5 GB/s1–2 GB/s
Performance sans AES-NI100–300 MB/s400–800 MB/s
Taille du nonce96 bits96 bits
Taille du tag auth128 bits (16 B)128 bits (16 B)
Risque réutilisation nonceCatastrophique (expose clé)Expose données
Résistance timing attacksDépend d'AES-NIConstant-time natif
Support Python cryptography✓ Natif✓ Natif
Support OpenSSL 3.x
Standardisation IETFRFC 5116RFC 8439

Quel algorithme choisir pour le licensing ?

Pour un système de licensing Python distribué sur des postes Windows et Linux standard en 2026 :

  • Machines x86 modernes (99% des cas) → AES-256-GCM. L'accélération matérielle le rend imbattable en vitesse, et la réutilisation de nonce est contrôlée côté code.
  • ARM, Raspberry Pi, IoT, Android → ChaCha20-Poly1305. Pas d'AES-NI, la performance logicielle est supérieure et le temps constant natif évite les timing attacks.
  • Environnements FIPS 140-2 → AES-256-GCM obligatoire (ChaCha20 n'est pas certifié FIPS).

Le choix d'IronLock v2

IronLock v2 utilise AES-256-GCM comme algorithme principal, avec fallback automatique vers ChaCha20-Poly1305 si l'instruction AES-NI est absente. Ce fallback est détecté au démarrage via CPUID :

import cpuinfo

def select_cipher() -> str:
    flags = cpuinfo.get_cpu_info().get('flags', [])
    if 'aes' in flags:
        return 'AES-256-GCM'      # accélération matérielle
    return 'ChaCha20-Poly1305'  # fallback logiciel

CIPHER = select_cipher()
# Stocké dans le header .ironenc pour que le loader
# sache quel algorithme utiliser pour déchiffrer

Conclusion

Les deux algorithmes offrent une sécurité équivalente en 2026. Le choix se fait sur le profil matériel : AES-NI présent → AES-256-GCM ; absent → ChaCha20-Poly1305. Pour un licensing desktop Python classique, AES-256-GCM avec fallback automatique est la stratégie optimale — c'est exactement ce qu'implémente IronLock v2.

🔐
PRODUIT LIÉ
IronLock v2.0 — AES-GCM + fallback ChaCha20
← Article précédent Article suivant →