Dans mon 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.

À mon sens, il existe trois types d'aléatoire en informatique :

  • L'aléatoire absolu (ou théorique)
  • L'aléatoire réel (ou extrinsèque)
  • L'aléatoire fonctionnel (ou intrinsèque)

Voyons maintenant la différence entre ces trois concept 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). 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.

Malheureusement ce n'est pas le cas aujourd'hui et il faut nous en remettre à des méthodes plus réalistes.

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, 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.

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 critique, la cryptographie notamment, mais pas absolue.

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 - L'aléatoire fonctionnel

Ici on parle de l'aléatoire le plus courant, utilisant les paramètres internes 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 pseudo-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

Tu as aimé cet article ? Tu veux me donner ton avis ou une idée ? Alors on se retrouve sur Facebook, Linkedin, Twitter ou même Instagram !

À bientôt !


À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage de 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 "JAW : de Junior à Warrior" pour recevoir 1 conseil par semaine par email.


Image par Andrew Martin sur Pixabay