Un hasard qui n'en est pas

Pseudo-aléatoire et vrais générateurs

Un ordinateur est une machine déterministe : les mêmes entrées produisent les mêmes sorties. Produire du hasard y est donc, par nature, un problème.

Les générateurs pseudo-aléatoires

Un PRNG part d'une valeur initiale — la graine (seed) — et déroule une suite par calcul :

(graine) --> x1 --> x2 --> x3 --> ...

La suite paraît irrégulière, mais elle est entièrement déterminée par la graine. Même graine, même suite.

Ceux des bibliothèques standard, comme rand(), sont conçus pour la simulation ou les jeux : rapides et bien répartis, mais prédictibles. En observant quelques sorties, on retrouve l'état interne et on prédit tout le reste.

Ne les utilise jamais pour de la cryptographie. Le nom de la fonction ne prévient pas.

Les générateurs cryptographiques

Un CSPRNG ajoute la garantie manquante : connaître les sorties passées ne permet pas de deviner les suivantes, ni de remonter à l'état interne.

En pratique, demande-le au système d'exploitation :

Plateforme Ce qu'il faut appeler
Linux, macOS getrandom(), /dev/urandom
Windows BCryptGenRandom()
Dans un navigateur crypto.getRandomValues()

Le système est le mieux placé : il collecte en continu de l'imprévisible venu du matériel.

D'où vient l'imprévisible

Le système accumule des événements physiques difficiles à reproduire — intervalles précis entre frappes clavier, mouvements de souris, temps d'accès disque, bruit électrique de composants dédiés.

Il en extrait une réserve d'entropie qui alimente le générateur.

Le moment délicat

Le démarrage est le point faible. Un serveur virtuel qui vient d'être créé n'a ni clavier, ni souris, ni historique : sa réserve est presque vide.

C'est pourquoi des machines fraîchement instanciées ont pu générer des clés faibles, parfois identiques d'une machine à l'autre. Une étude de 2012 a ainsi retrouvé la clé privée de dizaines de milliers de serveurs sur Internet, simplement parce que deux d'entre eux partageaient un facteur premier — signe que leur hasard de démarrage était le même.