Dans un précédent article, j'avançais que l'aléatoire n'existe pas en informatique, mais aujourd'hui je voudrais vous expliquer pourquoi il n'existe pas, ou du moins, pas vraiment.

Car oui, il faut prendre des pincettes lorsque l'on évoque la génération d'un chiffre aléatoire par des ordinateurs.

On peut dire qu'il existe trois types d'aléatoire en informatique :

  • L'aléatoire absolu (théorique)
  • L'aléatoire réel (extrinsèque)
  • Le pseudo-aléatoire (intrinsèque)

Voyons maintenant la différence entre ces trois concepts de manière simple et compréhensible.

1 - L'aléatoire absolu

Commençons par définir la notion générale d'aléatoire en utilisant l'un de ses synonymes : aléatoire signifie imprévisible.

Comme la nature est bien faite, il se trouve que le hasard se trouve tout autour de nous. Les lois de notre univers sont régies par une science que l'on appelle la physique quantique.

N'ayez pas peur, pas besoin d'être physicien pour comprendre la suite de l'article.

L'une des caractéristiques de la physique quantique est son imprévisibilité car elle ne repose pas sur des mesures exactes connues, mais sur un ensemble de probabilités.

Pour vous donner un exemple, sans rentrer dans les détails, il est physiquement impossible de prévoir exactement la vitesse de désintégration radioactive d'un atome (ce n'est qu'un exemple parmi tant d'autres).

Ici, impossible ne veut pas dire "impossible avec nos techniques actuelles", mais bien factuellement impossible selon les lois de la physique.

Il existe donc dans la nature des exemples d'aléatoire absolu.

Dans le cas ou un système informatique serait capable d'évaluer avec précision cette désintégration à un instant t et de manière efficace, nous serions capable de générer un nombre réellement, et parfaitement, aléatoire.

Un nombre, entièrement imprévisible à l'avance.

Il est certains que d'intégrer de tels systèmes de mesure d'évènements physique à l'intérieur de l'ordinateur de monsieur tout le monde est impensable, et donc l'aléatoire absolu n'existe pas en informatique classique.

À l'inverse, un ordinateur dit "quantique" sera lui capable de générer un nombre aléatoire absolu car son fonctionnement repose directement sur cette physique non-déterministe.

Pour notre informatique classique, celle que nous utilisons tous les jours, il faut donc nous en remettre à des méthodes plus réalistes, présentées juste après.

2 - L'aléatoire réel

Le but d'un chiffre aléatoire, notamment en cryptographie, est d'être suffisamment imprévisible pour qu'un attaquant ne puisse deviner sa valeur.

Et en l’occurrence, nos ordinateurs sont capables de générer de tels chiffres, sauf que leur système étant spécifiquement basé sur la logique, ces derniers doivent bénéficier d'une aide extérieure au système sous la forme de données imprévisibles.

En utilisant des données extérieures au système en question (extrinsèque), nous sommes alors capable de générer un nombre suffisamment aléatoire pour être utilisé en condition réelle.

Par exemple, une telle fonction va utiliser la position de la souris de l'utilisateur à un instant t, ou bien la vitesse de rotation des pales du ventilateur ou encore la température du CPU pour générer un nombre aléatoire suffisant.

Même si ces valeurs ne sont pas parfaitement aléatoires au sens physique du terme, il serait infiniment difficile pour un attaquant de prévoir la valeur exacte de ces nombres.

Ce type d'aléatoire réel est donc suffisant pour les utilisations les plus critiques, la cryptographie notamment, mais pas absolue.

Néanmoins, cela signifie que si un attaquant a directement accès à la machine en elle-même, il pourrait (en théorie) arriver à reproduire ces nombres aléatoires en interceptant les données utilisées.

Il existe même des expériences montrant qu'il est possible de décrypter une clé RSA grâce à l'analyse du son produit par le ventilateur de la machine : https://www.cs.tau.ac.il/~tromer/acoustic/

3 - Le pseudo-aléatoire

Ici on parle de l'aléatoire le plus courant, utilisant les paramètres internes (intrinsèque) de la machine et servant principalement à de la logique métier comme retourner une liste de ressources triées aléatoirement par exemple.

La plupart du temps ces méthodes utilisent des fonctions mathématiques ainsi qu'un facteur temporel afin de générer un chiffre quasi-aléatoire, suffisant pour une utilisation non-critique, mais bien loin d'un aléatoire sécurisé.

Voilà par exemple un article expliquant l'implémentation de la fonction Math.random() en Javascript, montrant bien qu'il s'agit simplement d'un nombre pseudo-aléatoire : https://v8.dev/blog/math-random

J'espère que cet article vous aura été utile, et à bientôt sur le blog !

Les articles les plus populaires du blog

Envie de continuer à lire des articles autour du développement web (entre autres) ? Voici la sélection des articles de mon blog les plus lus par la communauté !

Voir la sélection 🚀

Recevez les articles de la semaine par e-mail pour ne rien manquer !

S'abonner à la newsletter 📧

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Image par Andrew Martin sur Pixabay