Comment fonctionnent les générateurs de nombres aléatoires : PRNG, CSPRNG et véritable caractère aléatoire
Les ordinateurs sont déterministes, alors comment peuvent-ils produire des nombres imprévisibles ? Un guide pratique sur les graines, les algorithmes, l'entropie et le caractère aléatoire du navigateur.
Les nombres aléatoires alimentent les cadeaux, les jeux, les simulations, les mots de passe et le cryptage. Ce qui est surprenant, c’est que la plupart des nombres aléatoires ne le sont pas du tout. Ils sont produits par un processus déterministe qui semble imprévisible de l’extérieur.
Points clés à retenir
- Un générateur de nombres pseudo-aléatoires (PRNG) transforme une graine en une longue séquence répétable.
- Un PRNG cryptographiquement sécurisé (CSPRNG) est conçu de telle sorte que les sorties passées ne peuvent pratiquement pas révéler les futures.
- Le véritable caractère aléatoire provient de sources d'entropie physique, et non d'un seul algorithme.
- Les navigateurs exposent un CSPRNG via crypto.getRandomValues(), ce qui est le bon choix pour les tirages au sort quotidiens.
- L'équité dépend également de la manière dont les valeurs sont mappées sur une plage : une arithmétique modulo biaisée peut discrètement favoriser certains résultats.
Pourquoi le hasard est plus difficile qu'il n'y paraît
Un ordinateur suit des instructions. Si vous exécutez deux fois le même programme avec les mêmes entrées, vous obtenez normalement le même résultat. Un générateur de nombres aléatoires doit briser cette attente sans casser la machine.
Le logiciel résout généralement le problème en deux niveaux. Premièrement, il collecte une petite quantité de données imprévisibles, appelées entropie, provenant de sources telles que la gigue temporelle, les événements de clavier ou le bruit matériel. Deuxièmement, il utilise cette entropie comme graine pour un algorithme qui produit un long flux de nombres. Le flux semble aléatoire, mais il est entièrement déterminé par la graine et l'algorithme.
Cette conception est utile. Il rend les nombres aléatoires reproductibles pour les simulations et les tests. Cela signifie également qu'un générateur mal ensemencé peut répéter la même séquence sur différentes machines, c'est pourquoi la qualité des semences est importante.
Que fait un générateur de nombres pseudo-aléatoires
Un PRNG conserve un état interne. Chaque fois que vous demandez un nombre, il transforme l'état et renvoie une partie du résultat. La transformation est généralement rapide et déterministe. Étant donné le même état de départ, la même séquence apparaît à nouveau.
La plupart des PRNG finissent par répéter leur état. Le nombre de valeurs avant la répétition est appelé point. Une longue période est utile, mais elle ne garantit pas automatiquement la sécurité d’un générateur. Un attaquant capable d'observer suffisamment de résultats peut être capable de reconstruire l'état interne et de prédire les valeurs futures.
PRNG contre CSPRNG
Un PRNG à usage général est optimisé pour la vitesse et la qualité statistique. Un CSPRNG est conçu pour résister à la prédiction. Il utilise des primitives cryptographiques et est construit de telle sorte que l'apprentissage d'une sortie ne révèle pas la suivante.
Math.random() de JavaScript ne convient pas aux travaux sensibles à la sécurité. C'est rapide et pratique, mais les moteurs ne garantissent pas la qualité cryptographique. Les navigateurs fournissent crypto.getRandomValues() pour le caractère aléatoire lié à la sécurité. Il remplit un tableau typé avec des octets aléatoires en utilisant la source cryptographique de la plateforme.
Pour les mots de passe, les jetons, les tirages au sort avec un prix et tout ce qu'un attaquant pourrait vouloir prédire, utilisez un CSPRNG. Pour une animation décorative ou une simulation grossière, un PRNG classique peut suffire.
D'où vient le véritable hasard
Aucun algorithme logiciel ne peut créer des informations à partir de rien. Le véritable hasard pénètre dans le système par le biais de processus physiques : désintégration radioactive, bruit thermique ou timing précis des entrées de l'utilisateur. Les systèmes d'exploitation collectent ces signaux dans un pool d'entropie et les utilisent pour amorcer des générateurs cryptographiques.
Les systèmes d'exploitation et les navigateurs modernes mélangent continuellement l'entropie. Vous n'avez pas besoin d'agiter votre souris pour réaliser un tirage au sort, mais le système a besoin d'une source d'entropie saine pendant le démarrage et après de longues périodes d'inactivité. C’est l’une des raisons pour lesquelles les générateurs cryptographiques sont soigneusement conçus plutôt qu’improvisés.
Comment fonctionnent les générateurs de ce site
Les outils de ce site utilisent crypto.getRandomValues() dans votre navigateur. Les résultats sont générés localement et ne sont pas téléchargés.
Pour les plages de nombres entiers, le navigateur renvoie une valeur non signée de 32 bits. Une approche naïve utilise le reste après la division, mais cela peut introduire un léger biais lorsque la plage ne se divise pas uniformément dans l'espace complet de 32 bits. Les générateurs utilisent plutôt l'échantillonnage par rejet : les valeurs en dehors de la région non biaisée sont rejetées et redessinées. Le résultat est une distribution uniforme sur la plage demandée.
Les mélanges utilisent l'algorithme Fisher – Yates avec des indices aléatoires sécurisés. Contrairement à un tri occasionnel avec un comparateur aléatoire, Fisher-Yates produit chaque permutation avec une probabilité égale lorsque les indices aléatoires sont uniformes.
Qu'est-ce qui est suffisamment aléatoire pour votre cas d'utilisation ?
Utilisez le pseudo-aléatoire ordinaire pour les animations, les illustrations de jeu ou les simulations approximatives où la prévisibilité n'a aucun coût. Utilisez un CSPRNG pour :
- Mots de passe et codes de récupération.
- Cadeaux, tirages au sort et auditions avec un vrai prix.
- Affectation aléatoire des personnes à des équipes ou des groupes.
- Jetons, identifiants de session et tout ce qui concerne la sécurité.
- Tout match nul dont vous pourriez avoir besoin de défendre publiquement.
Pour les clés cryptographiques à long terme, utilisez un système de gestion de clés dédié plutôt qu'un site Web. Le caractère aléatoire du navigateur est important, mais le cycle de vie des clés, le stockage et le contrôle d'accès sont tout aussi importants que les bits initiaux.
Une simple vérification de l'équité
Vous pouvez tester un générateur de manière informelle en exécutant de nombreux tirages et en examinant la distribution. Avec un dé à six faces, chaque face devrait apparaître environ un sixième du temps. Les courtes séries varient et les stries sont normales. Ce qui compte est de savoir si le processus est impartial sur de nombreux essais et s'il est suffisamment reproductible pour permettre un audit.
Pour les tirages publics, enregistrez les entrées, les paramètres et le résultat. Le dossier fait plus pour la confiance que toute allégation de hasard.
Conclusion
Le hasard est une chaîne de décisions techniques : collecte d’entropie, choix d’algorithmes, cartographie impartiale et utilisation transparente. Un bon générateur n’a pas besoin d’être mystérieux. Il doit être imprévisible là où cela compte, documenté là où il est utilisé et honnête quant à ses limites.
Essayez l'outil
Générateur de nombres aléatoires
Choisissez des entiers dans n’importe quelle plage.