Recherche de site Web

Entropie aléatoire dans Bash


Lorsque vous utilisez des nombres aléatoires dans Bash, la question de l’entropie aléatoire se posera tôt ou tard. Cet article vous aidera à comprendre ce qu’est l’entropie, comment elle peut être modifiée et optimisée dans Bash, et comment elle affectera la génération de nombres aléatoires.

Dans ce tutoriel, vous allez apprendre :

  • Comment générer de l’entropie aléatoire dans Bash
  • Comment pré-amorcer le générateur de nombres aléatoires dans Bash
  • Exemples démontrant la génération aléatoire d’entropie dans Bash

Entropie aléatoire dans Bash

Configuration logicielle requise et conventions utilisées

Exemple 1 : Aléatoire ou pas si aléatoire ?

Nous pouvons facilement générer un nombre aléatoire dans Bash :

echo $RANDOM
13

Cependant, bien que ce nombre semble aléatoire, il n’est en fait pas, ou au mieux pseudo-aléatoire. En effet, un ordinateur ne peut jamais être vraiment aléatoire et le générateur de nombres aléatoires dans Bash est pré-amorcé avec une valeur, qui détermine tous les appels ultérieurs de la variable/fonction $RANDOM.

Pré-amorçons le générateur de nombres aléatoires de différentes manières. Nous allons commencer par pré-amorcer le générateur aléatoire avec la graine '1' en définissant RANDOM à 1 :

echo $RANDOM
25552
RANDOM=1  
echo $RANDOM
16807
RANDOM=1
echo $RANDOM
16807  
echo $RANDOM
15089
RANDOM=1
echo $RANDOM
16807  
echo $RANDOM
15089
RANDOM=a
echo $RANDOM
20034

Notez que les résultats 16807 et 15089 restent les mêmes alors que le générateur aléatoire a été pré-amorcé avec 1. Il change lorsqu’il est pré-ensemencé avec un.

Bien que la variable $RANDOM dans Bash produise toujours un nombre aléatoire généré par le générateur de nombres aléatoires Bash, c’est aussi une variable qui, lorsqu’elle est définie, pré-amorce le générateur aléatoire. Le défi est que si la graine est la même, le résultat (et la séquence !) sera également le même, comme vous pouvez le voir en étudiant l’exemple ci-dessus.

La façon dont le générateur aléatoire est initialisé dans votre système peut dépendre du système d’exploitation Linux ou Unix utilisé, du matériel utilisé et des paramètres de configuration. Convenons immédiatement que ce n’est pas un moyen très sûr de générer un nombre aléatoire vrai/réel, d’où les termes pseudo-aléatoire et pseudo-aléatoire. Cela dit, il y a beaucoup à faire pour le rendre (beaucoup) meilleur.

Exemple 2 : Notre propre générateur d’entropie aléatoire

La seule entrée disponible pour le générateur aléatoire est essentiellement la graine telle qu’elle est passée à RANDOM=. Alors, comment pouvons-nous trouver une graine vraiment aléatoire pour amorcer le générateur aléatoire, et créer une véritable entropie aléatoire (entropie : la qualité du manque de prévisibilité) ? L’entropie aléatoire est importante, en particulier dans le domaine de la sécurité informatique.

Réfléchissez à cette question ; comment pouvez-vous fournir (à Bash) l’entrée la plus aléatoire à utiliser comme graine pour la génération d’entropie aléatoire ?

Je crois avoir trouvé une solution dans le code suivant :

date +%s%N
1593785871313595555
       |--------| < Selected part indicated
date +%s%N | cut -b10-19
4418322030
date +%s%N | cut -b10-19
4914627208
date +%s%N | cut -b10-19
5282934388
date +%s%N | cut -b10-19
5635463163
date +%s%N | cut -b10-19
5967700148
date +%s%N | cut -b10-19
6322917009
RANDOM=$(date +%s%N | cut -b10-19)
echo $RANDOM
16349
RANDOM=$(date +%s%N | cut -b10-19)
echo $RANDOM
9713

Le résultat final de la 9713 est presque vraiment aléatoire.

date + %s %N est une combinaison de %s qui est le nombre de secondes depuis 1970-01-01 00:00:00 UTC - un nombre assez unique, mais toujours quelque chose qui pourrait potentiellement être recalculé. Et %N est de nanosecondes. Ensuite, nous découpons l’entrée pour ne saisir que les 10 derniers chiffres.

Cela signifie que nous passons le deuxième (dernier chiffre 0-9) + la nanoseconde exacte 000000000-99999999999 au générateur aléatoire en tant que graine. Ce serait presque impossible à reconstruire, à moins que vous ne saisissiez la valeur générée avant de l’attribuer. Presque vraiment aléatoire.

Cela signifie également que vous pouvez obtenir un nombre semi-aléatoire de x chiffres en sélectionnant simplement la partie la plus granulaire de la microseconde :

date +%s%N | cut -b19-19
date +%s%N | cut -b18-19
date +%s%N | cut -b17-19

La première commande produira 1 chiffre, la seconde 2 chiffres, etc.

Cependant, plus votre tranche coupée devient longue (en augmentant la longueur de coupe), moins le nombre sera pseudo-aléatoire, surtout une fois que vous aurez coupé en deuxième partie. Vous pouvez également laisser de côté le %s et réduire la taille de coupe pour avoir un appel système moins intensif. Bien que cela n’ait peut-être pas d’importance pour un seul appel de $RANDOM, cela aurait de l’importance s’il était appelé des centaines de milliers de fois.

Conclusion

Dans cet article, nous avons vu comment générer une entropie aléatoire, de manière raisonnablement aléatoire. Bien qu’aucun générateur d’entropie aléatoire ne soit parfait (et donc tout nombre aléatoire qui en résulte), nous nous en sommes approchés en faisant appel au temps de la nanoseconde. Nous avons également vu comment le pré-ensemencement de la variable d’entropie du générateur aléatoire avec une graine spécifique produira par la suite les mêmes résultats chaque fois qu’un nombre aléatoire est généré à l’aide de la variable $RANDOM.

Mettez à jour vos scripts avec notre initialiseur d’entropie aléatoire, ou faites-nous savoir si vous en avez découvert un meilleur dans les commentaires ci-dessous. Qui d’autre s’intéresse à une meilleure entropie ?!

Jouir!

Articles connexes: