Qu'est-ce que l'aléatoire, vraiment ?
Le mot "aléatoire" cache trois réalités très différentes selon la discipline qui l'emploie. En philosophie, l'aléatoire renvoie à l'absence de cause déterministe — une position compatible avec l'indéterminisme de la mécanique quantique, mais difficile à réconcilier avec la physique classique. En mathématiques et statistiques, un processus est dit aléatoire si sa distribution de probabilité satisfait certaines propriétés (uniformité, indépendance, absence d'autocorrélation) — ce qui est une définition opérationnelle, pas ontologique. En informatique, la question est plus prosaïque : comment produire une séquence de bits qui soit suffisamment imprévisible pour l'usage envisagé, qu'il s'agisse d'un jeu vidéo ou d'une clé de chiffrement ?
Le paradoxe fondamental de l'informatique est le suivant : un ordinateur est une machine déterministe. Partant du même état initial, il produit toujours exactement les mêmes résultats. Il ne peut donc pas, par lui seul, générer du "vrai" aléatoire au sens philosophique du terme. Ce qu'il peut faire, c'est simuler l'aléatoire de manière convaincante (PRNG), ou exploiter des phénomènes physiques externes réellement imprévisibles pour s'en rapprocher (CSPRNG alimenté par des sources d'entropie matérielle, ou vrai aléatoire quantique).
Cette distinction n'est pas académique. En 2012, des chercheurs en sécurité ont montré que 0,2 % des clés RSA publiques sur Internet partageaient un facteur premier commun — signe que deux machines distinctes avaient utilisé la même seed aléatoire faible au moment de générer leurs clés (article "Mining Your Ps and Qs" — Heninger et al., USENIX Security 2012). Résultat : ces clés, censées être inviolables, pouvaient être factorisées en quelques secondes. L'aléatoire mal compris a des conséquences réelles et mesurables.
L'aléatoire statistique vs l'imprévisibilité cryptographique
Une subtilité cruciale : une séquence peut être statistiquement aléatoire (uniforme, sans corrélation détectable) sans être cryptographiquement sûre. Pourquoi ? Parce que la sécurité cryptographique exige l'imprévisibilité même pour un adversaire qui connaît l'algorithme utilisé. Un PRNG peut produire une distribution parfaitement uniforme tout en étant totalement prédictible si l'adversaire connaît son état interne. Cette distinction est au cœur de la différence entre PRNG et CSPRNG.
PRNG : les générateurs pseudo-aléatoires
Un générateur de nombres pseudo-aléatoires (PRNG, Pseudo-Random Number Generator) est un algorithme déterministe qui, à partir d'une valeur initiale appelée seed (graine), produit une séquence de nombres qui ressemble statistiquement à de l'aléatoire. Le principe est simple : un état interne est initialisé avec la seed, puis une fonction de transition est appliquée répétitivement pour produire les sorties et mettre à jour l'état.
Le générateur congruentiel linéaire (LCG)
Le plus ancien et le plus simple des PRNG est le générateur congruentiel linéaire (LCG), dont la formule est :
X(n+1) = (a * X(n) + c) mod m
Où a, c et m sont des constantes soigneusement choisies (les valeurs du standard POSIX sont a = 1103515245, c = 12345, m = 2³¹). Ce générateur est rapide et simple à implémenter, mais catastrophiquement prédictible : connaître une seule sortie suffit à reconstruire l'état complet et à prédire toutes les valeurs suivantes. Il est implémenté par la fonction rand() du langage C sur la plupart des systèmes Unix — parfaitement adapté pour des simulations ou des jeux, absolument prohibé pour toute application cryptographique.
Le Mersenne Twister
Inventé en 1997 par Matsumoto et Nishimura, le Mersenne Twister (MT19937) est le PRNG le plus utilisé dans le monde. Il possède une période astronomique de 2¹⁹⁹³⁷ − 1 (soit environ 10⁶⁰⁰¹ valeurs avant de se répéter), passe tous les tests statistiques standards, et génère des nombres uniformément distribués sur 32 ou 64 bits. Il est l'implémentation par défaut de random.random() en Python, de java.util.Random en Java, et de la plupart des environnements de simulation.
Cependant, le Mersenne Twister a un état interne de 624 entiers 32 bits (2,5 Ko). En observant 624 sorties consécutives, un adversaire peut reconstruire l'état complet et prédire toutes les sorties futures — et même remonter aux valeurs passées. Cette attaque, documentée et implémentée publiquement (voir la bibliothèque mersenne-twister-predictor sur GitHub), rend le MT inutilisable pour la crypto. La documentation Python le dit explicitement : "The underlying Mersenne Twister algorithm is not suitable for all purposes."
Math.random() en JavaScript
La fonction Math.random() de JavaScript renvoie un nombre flottant entre 0 (inclus) et 1 (exclu). Sa spécification ne fixe aucun algorithme — chaque moteur JS est libre d'implémenter ce qu'il veut. En pratique, V8 (Chrome/Node.js) utilise depuis 2015 un algorithme nommé xorshift128+, dont l'état est de seulement 128 bits. Des chercheurs ont montré en 2017 (Fröhlich, Grossman) qu'en observant une quantité raisonnable de sorties via l'API, il est possible de reconstituer l'état interne et de prédire toutes les valeurs futures. Math.random() est pratique pour les jeux, les animations et les simulations — mais son usage pour générer des tokens, des clés ou des identifiants uniques est une faute de sécurité grave.
Période et propriétés statistiques
La période d'un PRNG est la longueur de la séquence avant qu'elle ne se répète. Pour un LCG standard, elle est au mieux de l'ordre de 2³¹ ≈ 2 milliards. Pour le Mersenne Twister, 2¹⁹⁹³⁷. Pour la cryptographie, la période n'est pas le critère décisif — c'est l'imprévisibilité. Un PRNG peut avoir une période colossale et rester totalement prédictible. Les tests statistiques comme la batterie Diehard ou NIST SP 800-22 évaluent la qualité statistique, pas la sécurité cryptographique.
CSPRNG : les générateurs cryptographiquement sécurisés
Un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG, Cryptographically Secure PRNG) est un PRNG qui satisfait des propriétés de sécurité supplémentaires, formalisées dans le cadre de la théorie de la complexité computationnelle.
Les trois propriétés fondamentales
Un CSPRNG doit satisfaire :
- Indistinguishability (next-bit test) : aucun algorithme polynomial ne doit pouvoir prédire le prochain bit avec une probabilité significativement supérieure à 50 %, même en connaissant toutes les sorties précédentes. C'est la propriété formalisée par le test "next-bit" de Blum et Micali (1982).
- Forward secrecy (protection vers l'avant) : si l'état interne est compromis à un instant T, l'adversaire ne doit pas pouvoir recalculer les sorties antérieures à T. Cela implique l'utilisation de fonctions à sens unique dans la chaîne de génération.
- Backward secrecy (protection vers l'arrière) : si l'état interne est compromis à T, il doit devenir rapidement "inutilisable" grâce à un mécanisme de réensemencement (reseeding) avec de nouvelles sources d'entropie.
Fortuna
Conçu par Bruce Schneier et Niels Ferguson (auteurs de Cryptography Engineering), Fortuna est un CSPRNG de référence. Il maintient 32 pools d'entropie, réalise des réensemencements périodiques, et utilise AES-256 en mode compteur pour la génération. Sa conception permet d'absorber de l'entropie de multiples sources simultanément (timings d'interruptions, mouvements de souris, accès disque) sans jamais pouvoir être "vidé" par un attaquant qui contrôlerait une seule source. Fortuna est à la base du générateur aléatoire de FreeBSD et macOS.
ChaCha20 et AES-CTR
Les implémentations modernes de CSPRNG s'appuient sur des chiffrements par flot. ChaCha20, conçu par Daniel J. Bernstein, est particulièrement prisé : rapide sur les processeurs sans instruction matérielle AES, résistant aux attaques par canal auxiliaire (timing attacks), et utilisé dans Linux depuis le noyau 4.8 comme algorithme principal du générateur aléatoire. AES-CTR (AES en mode compteur) est utilisé sur les plateformes disposant d'AES-NI matériel (Intel, AMD, ARM récents) pour ses performances optimales.
Les API standard pour développeurs
En pratique, aucun développeur ne doit implémenter son propre CSPRNG. Les plateformes fournissent des API standardisées :
- JavaScript (navigateur et Node.js) :
crypto.getRandomValues(typedArray)— remplit le tableau avec des octets cryptographiquement aléatoires. Dans Node.js,crypto.randomBytes(n)oucrypto.randomInt(min, max)sont équivalents. Ces fonctions s'appuient sur le CSPRNG du système d'exploitation sous-jacent. - Python : le module
secrets(introduit en Python 3.6) exposesecrets.token_bytes(),secrets.token_hex(),secrets.randbelow(n)— tous basés suros.urandom(). - Linux / Unix :
/dev/urandomfournit un flux d'octets pseudo-aléatoires cryptographiquement sûrs à partir du pool d'entropie du noyau./dev/randomest l'interface "bloquante" historique — bloquait quand l'entropie estimée était faible, mais depuis Linux 5.6, les deux sont équivalents. - Windows :
BCryptGenRandom()(Windows CNG) ou l'ancienneCryptGenRandom()— toutes deux certifiées FIPS 140-2.
La règle d'or : pour tout usage cryptographique, utiliser exclusivement les API CSPRNG de la plateforme. Ne jamais tenter de "bricoler" un PRNG ordinaire en le seeding différemment, ni d'appliquer des fonctions de hachage sur Math.random() pour le "sécuriser".
Le vrai aléatoire : sources d'entropie matérielle
Même les meilleurs CSPRNG sont, en dernier ressort, des algorithmes déterministes alimentés par une seed d'entropie. La qualité de cette seed est donc déterminante. D'où vient l'entropie réelle dans un système informatique ?
Sources d'entropie matérielle classiques
Les systèmes d'exploitation modernes collectent l'entropie de multiples sources physiques :
- Bruit thermique : les fluctuations électroniques dues à l'agitation thermique des électrons dans les résistances et transistors produisent un bruit de Johnson-Nyquist mesurable et réellement imprévisible.
- Timings d'interruptions matérielles : les nanosecondes de variation entre deux interruptions clavier, souris, réseau ou disque sont difficiles à prédire et constituent une source d'entropie précieuse. Linux les collecte via son "entropy pool".
- Fluctuations de tension et de courant : les variations de l'alimentation électrique, des cycles CPU et des accès mémoire introduisent une imprévisibilité mesurable au niveau hardware.
- Accélérateurs matériels dédiés : depuis Sandy Bridge (2011), les processeurs Intel intègrent l'instruction RDRAND, qui accède directement à un générateur d'entropie matériel (HRNG) basé sur le bruit thermique des circuits. AMD a suivi avec RDSEED/RDRAND sur ses processeurs Ryzen et EPYC.
La controverse Intel RDRAND
L'instruction RDRAND d'Intel a fait l'objet d'une controverse notable dans la communauté de sécurité. En 2013, au moment des révélations Snowden sur la NSA, des questions ont été soulevées sur la possibilité que l'instruction soit backdoorée — c'est-à-dire que la NSA aurait pu introduire un biais ou une trappe dans le générateur matériel d'Intel. La réponse pratique de Linus Torvalds et des équipes Linux a été pragmatique : RDRAND est utilisé comme une source d'entropie parmi d'autres dans le pool, mais jamais comme source unique. Le noyau Linux mélange (XOR) la sortie RDRAND avec d'autres sources d'entropie, de sorte qu'une backdoor dans RDRAND n'affecterait pas la sécurité globale tant que les autres sources restent non compromises. C'est une leçon générale : ne jamais faire confiance à une seule source d'entropie, aussi matérielle soit-elle.
Aléatoire quantique
La mécanique quantique est, par nature, fondamentalement non déterministe. Certains phénomènes quantiques sont donc des sources de vrai aléatoire au sens physique :
- Désintégration radioactive : le moment exact de désintégration d'un noyau radioactif est imprévisible en principe, gouverné uniquement par la probabilité quantique. Des générateurs commerciaux (comme ceux d'ID Quantique) exploitent ce phénomène.
- Photons et diviseurs de faisceau : un photon frappant un diviseur de faisceau (beam splitter) semi-réfléchissant a exactement 50 % de chances d'être transmis ou réfléchi — décision purement quantique. C'est la base des QRNG (Quantum Random Number Generators) les plus répandus.
- Fluctuations du vide quantique : même dans le "vide", les fluctuations d'énergie prédites par l'électrodynamique quantique produisent un bruit mesurable à l'échelle nanométrique, exploitable comme source d'entropie.
ANU QRNG : l'Australian National University publie un service de génération de nombres vraiment aléatoires (quantum.anu.edu.au) basé sur la mesure des fluctuations quantiques du vide électromagnétique. Il expose une API REST publique, longtemps utilisée pour alimenter des applications requérant du vrai aléatoire.
Cloudflare LavaRand : Cloudflare a mis en place un dispositif spectaculaire dans ses bureaux de San Francisco — une rangée de lampes à lave filmée en continu par des caméras. Les mouvements du liquide sont chaotiques, imprévisibles et capturés en temps réel pour alimenter leur pool d'entropie global. Ce n'est pas la seule source d'entropie de Cloudflare (ils utilisent aussi des pendules à double fil et un générateur radioactif), mais LavaRand est devenu symbolique de la créativité possible dans la collecte d'entropie.
Quand utiliser quoi : guide pratique par cas d'usage
Le choix entre PRNG, CSPRNG et vrai aléatoire dépend entièrement du contexte d'utilisation. Utiliser un CSPRNG là où un PRNG suffirait est du gaspillage de ressources. Utiliser un PRNG où un CSPRNG est requis est une faille de sécurité. Voici la grille de décision.
Cas où un PRNG classique suffit
- Jeux vidéo et simulations : génération de terrain procédural, IA adversariale, effets visuels aléatoires. La reproductibilité (même seed → même carte de jeu) est souvent une fonctionnalité, pas un défaut. Le Mersenne Twister est le choix standard.
- Simulations Monte Carlo : calcul numérique, modélisation financière, simulations physiques. La qualité statistique prime sur l'imprévisibilité. Rechercher des PRNG avec de bonnes propriétés d'équidistribution (comme PCG64 ou SFC64, utilisés par NumPy depuis 1.17).
- Tests unitaires avec seed fixe : générer des données de test reproducibles. Idéalement documenter la seed utilisée.
- Permutation et mélange non sensibles : algorithme Fisher-Yates pour mélanger une playlist musicale dans une application locale.
Cas où un CSPRNG est obligatoire
- Génération de clés cryptographiques (AES, RSA, ECC) : la moindre prédictibilité détruit la sécurité du système entier. Utiliser exclusivement
crypto.getRandomValues(),os.urandom(),BCryptGenRandom()selon la plateforme. - Tokens d'authentification, sessions, cookies de sécurité : un token prévisible permet à un attaquant de l'usurper. RFC 4086 (IETF) recommande explicitement l'usage de CSPRNG pour la génération de nonces et d'identifiants de session.
- Nonces cryptographiques (IVs pour AES-CBC/GCM, nonces pour ChaCha20-Poly1305) : la réutilisation d'un nonce avec la même clé est souvent catastrophique. Pour AES-GCM, une collision de nonce permet à un attaquant de récupérer la clé. Un CSPRNG garantit une probabilité de collision négligeable.
- Génération de mots de passe : notre générateur de mots de passe s'appuie sur
crypto.getRandomValues()précisément pour cette raison. - Codes QR contenant des données sensibles : si le contenu encodé d'un QR code inclut un token secret ou une URL d'accès unique, la génération de ce token doit utiliser un CSPRNG.
- Tirage au sort avec valeur économique ou légale.
Cas où le vrai aléatoire apporte une valeur supplémentaire
- Protocoles de distribution quantique de clés (QKD) : la sécurité repose sur les lois de la physique, non sur la complexité computationnelle. Requiert du vrai aléatoire quantique.
- Loteries nationales certifiées : certains pays exigent un générateur matériel certifié pour les tirages officiels.
- Alimentation en entropie de CSPRNG en environnements virtualisés : les machines virtuelles peuvent manquer d'entropie au démarrage (problème du "boot entropy"). Des services comme les QRNG d'ID Quantique ou VirtIO-RNG sont utilisés pour les alimenter.
Tests statistiques d'aléatoire
Comment évaluer la qualité d'un générateur aléatoire ? Plusieurs batteries de tests statistiques ont été développées à cet effet.
La batterie Diehard
Développée par George Marsaglia dans les années 1990, Diehard est l'une des premières batteries de tests statistiques systématiques pour les PRNG. Elle comprend des tests de fréquence de bits, de chevauchement de séquences, de permutations, etc. Un PRNG qui "rate" Diehard est clairement défectueux. Un PRNG qui le "passe" est statistiquement correct — mais ça ne dit rien sur sa sécurité cryptographique.
NIST SP 800-22
La suite de tests NIST SP 800-22 (National Institute of Standards and Technology, Special Publication 800-22) est la référence pour évaluer les générateurs utilisés en contexte cryptographique. Elle comprend 15 tests statistiques : fréquence monobit, fréquence par blocs, runs, longueur de la plus longue suite, rang de matrices binaires, transformée de Fourier, non-chevauchement/chevauchement de templates, séquences de Maurer, entropie approximative, sommes cumulatives, excursions aléatoires. Passer NIST SP 800-22 est nécessaire mais pas suffisant pour la certification FIPS 140-3.
TestU01
Développée par Pierre L'Ecuyer et Richard Simard (Université de Montréal), TestU01 est considérée comme la batterie de tests la plus rigoureuse actuellement disponible. Elle comprend notamment la suite "BigCrush" (environ 100 tests statistiques intensifs). Le Mersenne Twister échoue à certains tests de BigCrush — ce qui confirme que même les meilleurs PRNG classiques ne sont pas parfaits statistiquement sur toutes les dimensions.
L'outil ent
ent (Fourmilab) est un utilitaire léger qui calcule l'entropie de Shannon, le chi-carré, la moyenne arithmétique, le Monte Carlo pour π et la corrélation sérielle d'un flux de données. Utile pour une vérification rapide, mais beaucoup moins rigoureux que NIST SP 800-22 ou TestU01.
Ce que "passer les tests" signifie — et ne signifie pas
Passer une batterie de tests statistiques signifie que la sortie du générateur ressemble à de l'aléatoire uniforme sur les dimensions testées. Cela ne prouve pas l'imprévisibilité cryptographique. Un générateur qui expose entièrement son état interne dans ses sorties peut passer tous les tests statistiques tout en étant trivialement prédictible. Les tests statistiques évaluent la qualité de distribution ; la sécurité cryptographique évalue l'imprévisibilité computationnelle. Ce sont deux propriétés orthogonales.
Pièges classiques de programmation
La mauvaise utilisation des générateurs aléatoires est l'une des sources les plus fréquentes de vulnérabilités cryptographiques. Voici les erreurs les plus communes, avec leurs corrections.
Seeder avec time() — la seed devinable
Une erreur classique en C/C++ et dans de vieux scripts PHP est d'initialiser un PRNG avec la valeur de l'horloge système :
// DANGEREUX — seed prévisible
srand(time(NULL));
int token = rand();
// PHP — aussi problématique
mt_srand(time());
$token = mt_rand();
Le problème : time() a une résolution d'une seconde. Un attaquant qui connaît approximativement quand le token a été généré n'a à tester qu'un petit nombre de seeds (quelques milliers si il connaît l'heure à la minute). Pour des tokens d'authentification ou des liens de réinitialisation de mot de passe, c'est une vulnérabilité exploitable en pratique. De nombreuses failles de "lien de reset de mot de passe prédictible" publiées dans les CVE en sont la conséquence directe.
Le modulo bias
Pour générer un nombre aléatoire dans une plage [0, n[, la première idée est d'utiliser l'opérateur modulo :
// BIAISÉ si RAND_MAX+1 n'est pas un multiple de n
int random_in_range = rand() % n;
Le problème : si RAND_MAX + 1 n'est pas divisible par n, les valeurs dans [0, (RAND_MAX + 1) % n[ apparaissent avec une probabilité légèrement supérieure. Pour n = 3 et RAND_MAX = 32767, les valeurs 0 et 1 apparaissent 10923 fois (vs 10922 pour 2) — un biais de 0,009 %. Négligeable dans un jeu, mais en cryptographie, ce biais peut être exploité par des attaques statistiques cumulatives.
La correction consiste à utiliser le rejection sampling (rejet des valeurs dans la zone de biais) :
// JavaScript — sans biais avec crypto.getRandomValues()
function randomInt(min, max) {
const range = max - min;
const bytesNeeded = Math.ceil(Math.log2(range) / 8) + 1;
const maxValid = Math.floor(256 ** bytesNeeded / range) * range;
let value;
do {
const buf = new Uint8Array(bytesNeeded);
crypto.getRandomValues(buf);
value = buf.reduce((acc, b) => acc * 256 + b, 0);
} while (value >= maxValid);
return min + (value % range);
}
// Python — secrets.randbelow() implémente le rejet automatiquement
import secrets
result = secrets.randbelow(n) # [0, n[ sans biais
La réutilisation de nonce en cryptographie
Un nonce ("number used once") doit être utilisé une seule fois par clé et par contexte. En AES-GCM, réutiliser un nonce avec la même clé est catastrophique : un attaquant qui observe deux chiffrés avec le même nonce peut en déduire le XOR des deux plaintexts, et avec un peu plus de données, récupérer la clé d'authentification GCM. Ce type d'attaque a permis la compromission de Sony PlayStation 3 en 2010 (réutilisation du nonce ECDSA qui permettait de dériver la clé privée). La règle : générer les nonces avec un CSPRNG, et en cas de doute, utiliser AES-GCM-SIV ou ChaCha20-Poly1305 avec des nonces synthétiques (dérivés du contexte plutôt que générés aléatoirement).
Oublier d'inclure tous les caractères dans une plage
Lors de la génération d'un mot de passe, une implémentation naïve peut construire un alphabet incomplet :
// Attention : cet alphabet omet certains caractères spéciaux
// et les chiffres ne sont pas uniformément représentés
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
// Résultat : l'entropie par caractère est de log2(62) ≈ 5,95 bits
// Si on ajoutait "!@#$%^&*()" (10 chars) : log2(72) ≈ 6,17 bits
// Un gain de 0,22 bit par caractère, soit ~3,5 bits sur 16 chars — non négligeable
Notre générateur de mots de passe résout ce problème en permettant d'activer ou désactiver chaque catégorie de caractères, avec une méthode de sélection non biaisée.
Aléatoire et conformité légale
Tirages au sort officiels en France
En France, les opérations promotionnelles avec tirage au sort sont encadrées par la loi n° 2014-344 du 17 mars 2014 (dite "loi Hamon") et ses textes d'application. Pour qu'un tirage soit valide légalement, le règlement doit être déposé chez un huissier de justice (ou notaire) avant l'opération. Le tirage lui-même doit être soit réalisé en présence de l'huissier, soit effectué par un outil ou une plateforme certifiée, avec journalisation complète (seed, algorithme utilisé, résultats, horodatage). Notre générateur de nombres aléatoires peut servir à des tirages informels ou de test. Pour un tirage à valeur légale (avec lots de valeur, concours public), la présence d'un huissier reste la voie la plus sûre.
RGPD et pseudonymisation
Le RGPD (Règlement Général sur la Protection des Données) reconnaît la pseudonymisation et l'anonymisation comme techniques de réduction du risque. Cependant, l'Article 29 Working Party (devenu EDPB) a précisé dans son avis 05/2014 que la pseudonymisation par simple hachage déterministe ne constitue pas une anonymisation : si l'espace des valeurs est petit (numéro de sécurité sociale, date de naissance), le hash peut être inversé par force brute. L'ajout d'un sel aléatoire cryptographiquement fort (généré par CSPRNG) transforme la pseudonymisation en une opération irréversible sans la clé. En pratique : toujours utiliser un CSPRNG pour générer les sels de hachage dans les systèmes traitant des données personnelles.
Équité algorithmique et fairness en machine learning
En apprentissage automatique, la qualité de l'aléatoire intervient à plusieurs niveaux : initialisation des poids de réseaux de neurones (Xavier/He initialization), mélange des données d'entraînement (shuffle), tirage d'échantillons (bootstrap, bagging). Des PRNG mal initialisés ou biaisés peuvent introduire des corrélations artificielles dans les données d'entraînement et affecter l'équité des prédictions. La reproductibilité exige une seed documentée et fixe ; la robustesse des résultats exige de tester avec plusieurs seeds différentes.
Tests en pratique : l'outil ent
Pour tester la qualité du flux aléatoire de votre système, vous pouvez utiliser l'outil ent :
# Linux/macOS — tester 1 Mo de /dev/urandom
dd if=/dev/urandom bs=1M count=1 | ent
# Résultat attendu pour une bonne source :
# Entropy = 7.999982 bits per byte.
# Chi-square : 253.43 (> 10% : bon)
# Arithmetic mean : 127.51 (idéal : 127.5)
# Monte Carlo Pi : 3.14159... (proche de π)
# Serial correlation : 0.000012 (proche de 0)
Un résultat d'entropie proche de 8 bits par octet indique une distribution quasi-uniforme — signe d'un bon générateur. Attention : comme expliqué plus haut, ce résultat ne prouve pas la sécurité cryptographique, seulement la qualité statistique.
L'avenir : aléatoire quantique grand public
La démocratisation du vrai aléatoire quantique est en marche. Plusieurs évolutions convergent pour rendre le QRNG accessible à une large audience de développeurs.
APIs QRNG accessibles aux développeurs
L'ANU Quantum Random Numbers Server (quantum.anu.edu.au) expose une API REST publique retournant des nombres vraiment aléatoires générés par des fluctuations du vide quantique. ID Quantique, entreprise suisse pionnière du domaine, propose des générateurs matériels PCIe et USB ainsi qu'une API cloud (Quantis). Ces services permettent d'alimenter un CSPRNG avec de l'entropie quantique certifiée — sans nécessiter de matériel quantique en local.
Intégration dans les navigateurs et les OS
La spécification W3C WebCrypto API, qui expose crypto.getRandomValues(), s'appuie déjà sur les sources d'entropie matérielles du système (RDRAND, RDSEED). L'évolution attendue est une meilleure traçabilité de la qualité d'entropie — permettre aux applications de savoir si leur générateur s'appuie sur du bruit thermique, du QRNG, ou uniquement sur des timings logiciels.
Post-quantum cryptography et qualité de l'aléa
Les algorithmes post-quantiques standardisés par le NIST en 2024 (ML-KEM/Kyber, ML-DSA/Dilithium, SLH-DSA/SPHINCS+) imposent des exigences spécifiques sur la qualité de l'aléatoire utilisé pour la génération de clés. ML-KEM, par exemple, requiert des vecteurs de bruit générés par des distributions binomiales centrées à partir de bytes aléatoires — une opération dont l'implémentation incorrecte (biais dans les bytes sources) peut compromettre la sécurité du schéma. La cryptographie post-quantique amplifie les conséquences d'une mauvaise qualité d'aléatoire, ce qui rend la compréhension de ces mécanismes encore plus critique pour les années à venir.
Synthèse : choisir le bon générateur
L'aléatoire en informatique n'est pas un sujet binaire. Il existe un continuum allant du PRNG rapide mais prédictible au générateur quantique physiquement non déterministe, en passant par le CSPRNG qui offre des garanties computationnelles suffisantes pour la quasi-totalité des applications cryptographiques.
La règle de base : utiliser le niveau d'aléatoire adapté à l'usage. Pour les jeux et les simulations, un bon PRNG comme PCG64 ou Mersenne Twister suffit amplement. Pour tout ce qui touche à la sécurité — mots de passe, clés, tokens, nonces — utiliser le CSPRNG natif de la plateforme, qui combine entropie matérielle et algorithmes cryptographiquement éprouvés. Le vrai aléatoire quantique apporte une garantie supplémentaire utile pour certains protocoles avancés, mais est rarement nécessaire en pratique pour la sécurité applicative.
Ce que vous ne devez jamais faire : utiliser Math.random() pour générer des secrets, seeder un PRNG avec time(), ou appliquer un modulo naïf sur la sortie d'un générateur. Ces erreurs, documentées dans des centaines de CVE, ont des conséquences réelles sur la sécurité des systèmes.
Pour mettre en pratique ces concepts, notre générateur de nombres aléatoires s'appuie sur crypto.getRandomValues(), garantit l'absence de modulo bias, et peut être utilisé pour des tirages au sort informels. Pour la génération de mots de passe sécurisés basée sur les mêmes principes CSPRNG, consultez notre générateur de mots de passe.