Question

D'accord, je suppose que c'est tout à fait subjectif et tout le reste, mais je pensais aux sources d'entropie pour les générateurs de nombres aléatoires. Il va de soi que la plupart des générateurs sont ensemencés avec l'heure actuelle, correct? Eh bien, j’étais curieux de savoir quelles autres sources pourraient être utilisées pour générer des nombres parfaitement valides et aléatoires (la définition approximative).

Si vous utilisiez plusieurs sources (telles que heure + heure de recherche du disque dur actuelle [nous sommes fantastiques ici]), vous créez ensemble un "plus aléatoire". nombre qu'une seule source? Quelles sont les limites logiques de la quantité de sources? Combien est vraiment suffisant? Le temps est-il choisi simplement parce que c'est pratique?

Excusez-moi si ce genre de chose n'est pas autorisé, mais je suis curieux de connaître la théorie derrière les sources.

Était-ce utile?

La solution

L'article de Wikipedia sur le du générateur de nombres aléatoires matériels répertorie quelques sources intéressantes de nombres aléatoires à l'aide de propriétés physiques.

Mes favoris:

  • Une source de radiation de désintégration nucléaire détectée par un compteur Geiger connecté à un PC.
  • Photons se déplaçant dans un miroir semi-transparent. Les événements mutuellement exclusifs (transmission par réflexion) sont détectés et associés à "0". ou " 1 " valeurs de bits, respectivement.
  • Bruit thermique d'une résistance, amplifié pour fournir une source de tension aléatoire.
  • Bruit d'avalanche généré par une diode à avalanche. (Qu'est-ce que c'est cool?)
  • Bruit atmosphérique détecté par un récepteur radio relié à un PC

La section des problèmes de l'article de Wikipedia décrit également la fragilité d'un grand nombre d'entre eux. sources / capteurs. Les capteurs produisent presque toujours des nombres de moins en moins aléatoires à mesure qu'ils vieillissent / se dégradent. Ces sources physiques doivent être constamment contrôlées par des tests statistiques permettant d'analyser les données générées, en s'assurant que les instruments ne sont pas en panne.

Autres conseils

SGI a déjà utilisé des photos d’une lampe à lave à diverses "phases globales". en tant que source d'entropie, qui a finalement évolué pour devenir un générateur de nombres aléatoires open source appelé LavaRnd .

J'utilise Random.ORG , ils fournissent des données aléatoires gratuites à partir du bruit atmosphérique, que j'utilise pour réensemencer périodiquement un RNG Mersene-Twister. C'est à peu près aussi aléatoire que possible, sans aucune dépendance matérielle.

Ne vous inquiétez pas pour un "bon". graine pour un générateur de nombre aléatoire. Les propriétés statistiques de la séquence ne dépendent pas de la façon dont le générateur est créé. Il y a d'autres choses, cependant. se préoccuper de. Voir Pièges de la génération de nombres aléatoires .

Comme pour les générateurs de nombres aléatoires matériels, ces sources physiques doivent être mesurées et le processus de mesure comporte des erreurs systématiques. Vous pourriez trouver " pseudo " les nombres aléatoires doivent avoir une qualité supérieure à celle de " real " nombres aléatoires.

Le noyau Linux utilise le minutage des interruptions de périphériques (souris, clavier, disques durs) pour générer une entropie. Il existe un article sur Wikipedia en entropie.

Les GNA modernes sont tous deux vérifiés par rapport aux corrélations des semences à proximité et exécutés plusieurs centaines d’itérations après l’ensemencement. Donc, la réponse malheureusement ennuyeuse mais vraie est que cela n'a pas vraiment d'importance.

De manière générale, l'utilisation de processus physiques aléatoires doit être vérifiée pour s'assurer qu'ils se conforment à une distribution uniforme et sont autrement perturbés.

À mon avis, il est souvent préférable d'utiliser un générateur de nombres pseudo-aléatoires très bien compris.

J'ai utilisé un programme de cryptage utilisant le mouvement de la souris des utilisateurs pour générer des nombres aléatoires. Le seul problème était que le programme devait faire une pause et demander à l'utilisateur de déplacer la souris de manière aléatoire pendant quelques secondes pour fonctionner correctement, ce qui pourrait ne pas toujours être pratique.

J'ai trouvé HotBits il y a plusieurs années, les chiffres sont générés à partir de la désintégration radioactive, véritablement nombres aléatoires .

Il y a une limite au nombre de numéros que vous pouvez télécharger par jour, mais cela m’amuse toujours de les utiliser comme des graines vraiment, vraiment aléatoires pour RNG.

Certains TPM (Trusted Platform Module) "puces" avoir un RNG matériel. Malheureusement, cette fonctionnalité ne figure pas dans le TPM (Broadcom) de mon ordinateur portable Dell, mais de nombreux ordinateurs vendus de nos jours sont livrés avec un générateur de ressources réseau qui utilise des processus de mécanique quantique véritablement imprévisibles. Intel a mis en œuvre la variété de bruit thermique.

De même, n'utilisez pas l'heure actuelle uniquement pour créer un RNG à des fins cryptographiques ou pour toute application dans laquelle l'imprévisibilité est importante. Utiliser quelques bits de poids faible de l’heure en conjonction avec plusieurs autres sources est probablement acceptable.

Une question similaire peut vous être utile.

Désolé, je suis en retard pour cette discussion (quel âge a-t-il maintenant trois ans et demi?), mais je suis de nouveau ravivé par la génération de PRN et d'autres sources d'entropie. Le développeur du noyau Linux, Rusty Russell, a récemment discuté de son blog sur d'autres sources d'entropie (autre que / dev / urandom ).

Mais je ne suis pas du tout impressionné par ses choix; L'adresse MAC d'une carte réseau ne change jamais (bien qu'elle soit unique parmi toutes les autres) et le PID semble être une taille d'échantillon possible trop petite.

J'ai jonglé avec un Mersenne Twister (sur mon ordinateur Linux), qui contient le même algorithme suivant. Je demande des commentaires / réactions si quelqu'un est disposé et intéressé:

  1. Créer un tampon de tableau de 64 bits + 256 bits * nombre de fichiers / proc ci-dessous.
  2. Placez la valeur du compteur d'horodatage (TSC) dans les 64 premiers bits de ce tampon.
  3. Pour chacun des fichiers / proc suivants, calculez la somme SHA256:

    • / proc / meminfo
    • / proc / self / maps
    • / proc / self / smaps
    • / proc / interrupts
    • / proc / diskstats
    • / proc / self / stat

      Placez chaque valeur de hachage de 256 bits dans sa propre zone du tableau créé dans (1).

  4. Créez un hachage SHA256 de tout ce tampon. REMARQUE: je pourrais (et devrais probablement) utiliser une fonction de hachage différente, totalement indépendante des fonctions SHA. Cette technique a été proposée en tant que "sauvegarde". contre les fonctions de hachage faibles.

Je dispose maintenant de 256 bits de données d'entropie aléatoire HOPEFULLY aléatoires (suffisantes) pour ensemencer mon Twister Mersenne. J'utilise ce qui précède pour renseigner le début du tableau MT (624 entiers 32 bits), puis initialiser le reste de ce tableau avec le code de l'auteur de MT. De plus, je pourrais utiliser une fonction de hachage différente (par exemple, SHA384, SHA512), mais il me faudrait un tampon de tableau de taille différente (évidemment).

Le code original de Mersenne Twister prévoyait une seule graine 32 bits, mais j'estime que c'est terriblement insuffisant. Courir " simplement " 2 ^ 32-1 différents MT cherchant à déchiffrer le crypto n’est pas au-delà des possibilités pratiques de nos jours.

J'aimerais lire les commentaires de quiconque à ce sujet. La critique est plus que bienvenue. Je vais défendre mon utilisation des fichiers / proc comme ci-dessus car ils changent constamment (en particulier les fichiers / proc / self / * , et le TSC produit toujours un résolution (nanoseconde [ou meilleure] résolution, IIRC). J'ai exécuté des tests Diehard sur ce sujet. (à hauteur de plusieurs centaines de milliards ), et cela semble passer très bien, mais cela témoigne probablement davantage de la solidité du Mersenne Twister en tant que PRNG que de la façon dont je sème il.

Bien sûr, ils ne sont pas totalement imperméables à toute personne qui les pirate, mais je ne vois pas tout cela (et SHA *) en train d'être piraté et cassé. dans ma vie.

Certains utilisent la saisie au clavier (délais entre les frappes au clavier). J'ai entendu parler d'un roman qui pense que la réception radio statique peut être utilisée - mais qui nécessite bien sûr d'autres matériels et logiciels ...

Bruit au-dessus du spectre de fond des hyperfréquences cosmiques. Bien sûr, vous devez d’abord supprimer certaines anisotropies, objets de premier plan, bruit de détecteur corrélé, vitesses de galaxie et de groupe local, polarisations, etc. nofollow noreferrer "> les pièges restent .

La source de semences n’est pas très importante. Plus important est l'algorithme générateur de pseudo-nombres. Cependant, il y a quelque temps, j'ai entendu parler de la production de semences pour certaines opérations bancaires. Ils ont pris plusieurs facteurs ensemble:

  • heure
  • température du processeur
  • vitesse du ventilateur
  • tension du processeur
  • Je ne me souviens plus de:)

Même si certains de ces paramètres ne changent pas beaucoup dans le temps, vous pouvez les insérer dans une bonne fonction de hachage.

Comment générer un bon nombre aléatoire?

Peut-être pouvons-nous prendre en compte un nombre infini d'univers? Si cela est vrai, à chaque fois que de nouveaux univers parallèles sont créés, nous pouvons faire quelque chose comme ceci:

int Random() {
    return Universe.object_id % MAX_INT;
}

À tout moment, nous devrions être sur une autre branche d'univers parallèles, nous devrions donc avoir un identifiant différent. Le seul problème est de savoir comment obtenir un objet Univers:)

Pourquoi ne pas créer un thread qui manipulera une variable dans une boucle étroite pendant un laps de temps déterminé avant son élimination? Ce que vous obtiendrez dépendra de la vitesse du processeur, de la charge du système, etc. Très hokey, mais meilleur que le simple srand (time (NULL)) ...

  

Ne vous inquiétez pas pour un "bon". graine pour un générateur de nombre aléatoire. Les propriétés statistiques de la séquence ne dépendent pas de la façon dont le générateur est créé.

Je ne suis pas d'accord avec les conseils de John D. Cook . Si vous ensemencez tous les bits de Mersenne Twister, sauf un, tous les bits seront générés, ce qui produira initialement des nombres qui ne sont pas aléatoires. Il faut beaucoup de temps au générateur pour transformer cet état en quelque chose qui passerait des tests statistiques. Le simple fait de définir les 32 premiers bits du générateur sur une graine aura un effet similaire. De plus, si l’état entier est à zéro, le générateur produira des zéros sans fin.

Le code RNG correctement écrit aura un algorithme d’amorçage correctement écrit qui accepte une valeur de 64 bits et amorce le générateur de manière à produire des nombres aléatoires décents pour chaque entrée possible. Donc, si vous utilisez une bibliothèque fiable, toute graine fera l'affaire. Mais si vous piratez votre propre implémentation, vous devez faire attention.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top