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éorique | 256 bits (128 effectifs) | 256 bits |
| Performance avec AES-NI | 3–5 GB/s | 1–2 GB/s |
| Performance sans AES-NI | 100–300 MB/s | 400–800 MB/s |
| Taille du nonce | 96 bits | 96 bits |
| Taille du tag auth | 128 bits (16 B) | 128 bits (16 B) |
| Risque réutilisation nonce | Catastrophique (expose clé) | Expose données |
| Résistance timing attacks | Dépend d'AES-NI | Constant-time natif |
| Support Python cryptography | ✓ Natif | ✓ Natif |
| Support OpenSSL 3.x | ✓ | ✓ |
| Standardisation IETF | RFC 5116 | RFC 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.