Un Random Number Generator, ou RNG, est un dispositif ou un programme qui produit des valeurs numériques. Un portefeuille a besoin d’un générateur cryptographiquement sûr : connaître ses résultats précédents ou l’heure de création ne doit pas permettre à un attaquant de prédire le nouveau secret en pratique. La source d’entropie, l’algorithme et leur utilisation par l’application sont déterminants. L’entropie décrit ici l’incertitude qui reste à un attaquant sur le résultat.
Imaginez un portefeuille qui tirerait son secret uniquement de l’heure actuelle. Le résultat pourrait sembler complexe, mais une personne connaissant le moment de sa création aurait bien moins de possibilités à essayer. RFC 4086 met justement en garde contre ces entrées prévisibles. Un générateur adapté aux jeux ou aux simulations ne convient donc pas forcément aux clés. Une bonne distribution statistique ne suffit pas non plus à prouver sa sécurité. [2]
Plusieurs éléments travaillent généralement ensemble. Une source fournit de l’incertitude, sa sortie est traitée si nécessaire, puis un générateur déterministe cryptographique produit d’autres valeurs à partir d’un état interne secret. Déterministe signifie qu’un même état interne et les mêmes entrées donnent le même résultat : cet état doit donc rester secret. L’application les demande par une interface du système. Chaque bit renvoyé ne nécessite donc pas une nouvelle mesure physique. NIST SP 800-90C décrit l’association de générateurs conformes à 90A et de sources conformes à 90B. [1]
Avec BIP39, la base de la récupération du portefeuille est créée avant même le premier mot : le générateur produit de 128 à 256 bits d’entropie initiale. Un bit est une unité élémentaire d’information, qui peut prendre la valeur zéro ou un ; l’essentiel est que l’attaquant ne puisse pas prévoir la suite obtenue. Une somme de contrôle, une courte valeur qui aide à repérer certaines erreurs de transcription, est ajoutée. L’ensemble est ensuite converti en mots de récupération. Vous pouvez leur ajouter une passphrase, un texte secret supplémentaire. La fonction PBKDF2 en dérive un seed de 512 bits, la valeur secrète de départ qui sert à dériver les clés du portefeuille. Ni une sortie plus longue ni une somme de contrôle n’apportent l’aléa manquant. Ne choisissez donc pas vous-même vos mots de récupération. [6]
Le dispositif doit détecter des défauts, par exemple une source de bruit qui se met à répéter la même valeur. NIST SP 800-90B exige donc des contrôles au démarrage et en fonctionnement, ainsi que le traitement des défaillances détectées. On ne peut pas ignorer une erreur tout en présentant la sortie comme un aléa vérifié. Ces contrôles surveillent la source ; ils ne garantissent pas la sécurité du portefeuille entier. [3]
Un générateur déterministe conserve un état interne pour calculer ses résultats suivants. NIST SP 800-90A décrit sa création, la génération, l’apport d’entropie fraîche (reseed) et son arrêt. Si cet état est divulgué, un nouvel appel ne suffit pas nécessairement à rétablir la sécurité. Il faut un mécanisme adapté et une entropie nouvelle inconnue de l’attaquant. Les clés déjà divulguées restent entre ses mains. [7]
Vous n’avez pas à programmer votre propre RNG. Vérifiez plutôt si la génération et la gestion des erreurs sont documentées pour la version précise du portefeuille. Les mentions « matériel » ou « hors ligne » ne le prouvent pas. Un examen doit couvrir la source, l’algorithme, l’initialisation et l’interface de l’application. Même un secret correctement créé perd sa protection si vous révélez ensuite sa sauvegarde. [1] [2]
Par défaut, getrandom() sous Linux attend l’initialisation d’urandom ; avec GRND_NONBLOCK, il peut renvoyer EAGAIN au lieu d’attendre. Après l’initialisation, une demande à urandom ne dépassant pas 256 octets est garantie complète et sans interruption par un signal. Cette garantie ne vaut pas pour les demandes plus grandes. Le programme doit vérifier le résultat de l’appel et le nombre d’octets réellement reçus. [4]
Web Crypto propose getRandomValues() pour remplir un tableau d’entiers pris en charge avec des valeurs cryptographiquement fortes. Au-delà de 65536 octets, il déclenche QuotaExceededError. Pour les clés des algorithmes pris en charge, la spécification recommande generateKey() ; ce n’est pas un générateur universel de portefeuilles Bitcoin. Une utilisation correcte de l’API ne prouve pas non plus la fiabilité de la page : son code peut accéder au secret créé. [5]
Pour une vision complète, lisez aussi Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. Cette entrée est également citée par CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.