J'ai entendu dire que la génération de nombres aléatoires dans les ordinateurs n'est pas vraiment aléatoire, mais il n'y a pas d'algorithme efficace pour le détecter. Comment peut-il être détecté?
20
J'ai entendu dire que la génération de nombres aléatoires dans les ordinateurs n'est pas vraiment aléatoire, mais il n'y a pas d'algorithme efficace pour le détecter. Comment peut-il être détecté?
Réponses:
Les ordinateurs sont vraiment aléatoires:
Le vrai caractère aléatoire est impossible pour Turing Machines dans un sens théorique, et la plupart des ordinateurs ne peuvent pas générer de sortie vraiment aléatoire. Par conséquent, certains ordinateurs modernes incluent un matériel qui permet à l'ordinateur d'accéder à une source extérieure qui, espérons-le, inclura un peu de hasard. Un exemple de la façon dont cela peut être accompli est de suivre les petites fluctuations de température à l'intérieur de l'ordinateur. L'aléatoire peut également être obtenu d'une source extérieure. Mais d'après le ton de votre message, je ne pense pas que les sources extérieures de hasard soient ce qui vous intéresse.
Des graines:
Sans ajout extérieur, tout ce qu'un ordinateur fait est déterministe. Cela conduit à un gros problème: si vous appelez un programme de génération de nombres aléatoires, il vous donnera le même résultat à chaque fois si vous lui donnez la même entrée. De toute évidence, nous avons besoin d'un programme qui génère un nombre aléatoire pour changer son comportement chaque fois qu'il est exécuté (sinon nous continuerons à obtenir le même nombre "aléatoire", ce qui n'est pas particulièrement utile). Une idée est de donner au programme une entrée, qui change à chaque exécution du programme, de sorte qu'un nombre différent soit sorti. Nous appelons cette entrée une «graine». Le générateur de nombres aléatoires doit prendre une graine, effectuer certaines opérations et nous donner un nombre aléatoire.
L'heure système actuelle est un exemple classique d'une graine. Cela donne une longue chaîne avec une entropie élevée, et si l'heure est suivie de manière suffisamment granulaire (c'est-à-dire si votre horloge système utilise des heures, alors "l'heure" est une graine assez pauvre), il est peu probable que vous fournissiez le nombre pseudo-aléatoire générateur le même nombre deux fois.
Algorithmes suffisamment aléatoires:
Nous avons maintenant un algorithme qui a au moins un moyen d'être différent à chaque exécution. Nous lui donnons une graine, et bien que l'algorithme donne le même nombre lorsqu'il est invité avec la même graine, nous voulons que les nombres qu'il génère soient aléatoires sinon. Cela agit comme ci-dessus - vous prenez une entrée et cela produit une sortie (espérons-le suffisamment différente de l'entrée pour être "aléatoire").
Supposons maintenant que vous ayez créé votre propre algorithme pour ce faire, et que vous prétendez que les chiffres que vous obtenez sont assez proches du hasard lorsque vous lui avez donné un tas de graines différentes. Comment pourrions-nous tester sa qualité?
Maintenant, nous voulons un algorithme qui prendra une graine, effectuera quelques opérations et produira un nombre aléatoire. Au plus simple, l'algorithme pourrait simplement sortir la graine - il ne nous donne pas le même nombre à chaque fois, et les graines aléatoires nous donnent des sorties aléatoires. Mais ce n'est clairement pas ce que nous voulons. D'un autre côté, un algorithme peut être assez compliqué, comme de nombreux générateurs pseudo-aléatoires réels. Comment savoir quels algorithmes nous donnent des nombres "aléatoires" à partir de nos graines pas nécessairement aléatoires? Si nous ne pouvons pas l'obtenir exactement, comment pouvons-nous savoir lesquels sont les meilleurs?
Assez aléatoire pour tromper un attaquant:
Maintenant, ce à quoi vous faites référence, ce sont les générateurs pseudo-aléatoires à sécurité cryptographique. Je pense que la meilleure façon d'expliquer cela est dans le contexte de ce qui précède - ici, nous utilisons notre caractère aléatoire pour la cryptographie, donc lorsque nous concevons des tests, ce qui nous importe vraiment, c'est que quelqu'un ne puisse pas casser notre sécurité en prédisant le nombre aléatoire que nous avons choisi. Je ne connais pas votre niveau de connaissance de la cryptographie, mais imaginez que nous faisons un simple cryptage de remplacement --- chaque lettre est remplacée par une autre lettre. Nous voulons choisir ces remplaçants au hasard, ils sont donc difficiles à deviner pour un attaquant. Mais s'il peut comprendre comment fonctionne mon générateur de nombres aléatoires, il sera en mesure de résoudre tout le chiffrement! Par conséquent, les algorithmes cryptographiques nécessitent des générateurs de nombres aléatoires qui sont particulièrement difficiles à deviner.
Pour cette raison, les CSPRG sont définis en fonction de la façon dont d'autres algorithmes les résolvent (c'est là que nous arrivons enfin à votre question). Plus précisément, disons que j'ai un CSPRG que j'appellerai R. R est un CSPRG si et seulement s'il n'y a PAS d'algorithme réalisable qui peut deviner quel bit il sortira ensuite. Cela est vrai même si vous connaissez tous les bits précédents qu'il a émis!
Disons donc que les cinq premiers bits de mon CSPRG ont une sortie de 10100. Vous ne connaissez pas l'entrée que j'ai utilisée pour le programme, mais vous avez accès au code que j'ai utilisé pour écrire mon CSPRG. Ensuite, il est impossible d'écrire un programme pour décider si la prochaine sortie de bit sera 101000 ou 101001.
Ainsi, pour des raisons de cryptographie, la capacité d'un générateur de nombres pseudo-aléatoires est parfois définie en termes de prévisibilité pour d'autres programmes. Notez que cela donne encore une grande partie de l'intuition du «hasard», car (disons) si vous savez que toutes les sorties aléatoires seront bizarres, elles ne sont pas sécurisées cryptographiquement et ne passent pas un test de hasard de bon sens.
la source
Récemment, j'ai trouvé un bon article sur l'aléatoire dans le calcul sur le blog du MIT CSAIL Theory of Computation Group: Pouvez-vous dire si un bit est aléatoire?
Le post commence par quelques idées extraites du merveilleux discours d'un Avi Wigderson sur la puissance et les limites de l'aléatoire dans le calcul, examinant le magnifique domaine des algorithmes randomisés et le lien surprenant entre pseudo-aléatoire et intractabilité informatique .
Ensuite, il résume certains résultats récents sur la cryptographie quantique; en particulier la façon de tester efficacement si la sortie d'un certain type de périphérique est vraiment aléatoire (protocoles d'expansion aléatoire).
Par exemple, voir les travaux récents d' Umesh Vazirani, Thomas Vidick, Certifiable Quantum Dice (Ou, expansion exponentielle aléatoire vérifiable)
Résumé: Nous introduisons un protocole grâce auquel une paire de dispositifs mécaniques quantiques peut être utilisée pour générer n bits de vrais aléa à partir d'une graine de O (log n) bits uniformes. Les bits générés sont certes aléatoires uniquement sur la base d'un simple test statistique qui peut être effectué par l'utilisateur et sur l'hypothèse que les appareils obéissent au principe de non-signalisation. Aucune autre hypothèse n'est posée sur le fonctionnement interne des appareils ....
la source
En supposant que vous parlez de hasard statistique - la cryptographie a d'autres besoins! - il existe toute une série de tests de qualité d'ajustement qui peuvent détecter si une séquence de nombres correspond à une distribution donnée. Vous pouvez les utiliser pour tester si un générateur de nombres (pseudo) aléatoires est sain (jusqu'à la qualité de votre test et la signification choisie).
Les suites de tests Diehard combinent différentes méthodes.
la source
Il s'agit d'un sujet large / complexe en informatique auquel l'autre réponse de SamM répond. Votre question spécifique semble être de savoir si les ordinateurs ont ce qu'on appelle des PRNG , c'est-à-dire des générateurs de nombres pseudo aléatoires, comment peut-on détecter cela?
La réponse courte est que les PRNG non triviaux sont construits de sorte que leurs algorithmes ne puissent pas être détectés (dérivés). En général, si le PRNG est ce qu'on appelle "sécurisé", même si un attaquant connaît l'algorithme utilisé pour générer la séquence pseudo-aléatoire, il ne peut pas deviner les paramètres particuliers utilisés pour générer la séquence. De cette façon, la pseudo-aléatoire a de nombreux liens profonds avec la cryptographie, et on peut parler de "briser" un PRNG de la même manière qu'un algorithme cryptographique peut être "brisé". Il existe de nombreux articles de recherche dans ce domaine, c'est un domaine actif à la pointe de la cryptographie.
Pour les PRNG "triviaux", par exemple un générateur linéaire congruentiel , si l'attaquant connaît l'algorithme utilisé pour le générer et qu'il n'est pas généré avec des "bignums" , l'espace de recherche est "relativement petit" et l'attaquant pourrait théoriquement trouver également les paramètres utilisé par le PRNG particulier essentiellement par la force brute et en essayant toutes les combinaisons.
Les PRNG peuvent être rompus dans la pratique (encore une fois en fonction de leur "sécurité") dans certains cas en exécutant une large suite de tests statistiques de hasard contre eux. c'est par exemple la raison d'être du programme "Dieharder" (par Brown). Il y a aussi une suite NIST .
La difficulté / dureté intrinsèque de la rupture des PRNG n'est pas encore strictement prouvée théoriquement mais est fondamentalement associée à ce que l'on appelle des "trappes" ou des "fonctions à sens unique". qui peuvent être calculées efficacement dans une direction mais sont "difficiles" à inverser (inverser) . Il y a quelques problèmes ouverts en cryptographie concernant la dureté aléatoire. Ces questions sont étroitement liées aux séparations de classes de complexité, par exemple la fameuse question P =? NP.
Les questions sur la rupture des PRNG concernent également la complexité de Kolmogorov , un domaine qui étudie les plus petites machines de Turing capables de générer des séquences. la rupture du PRNG est également étroitement liée à la recherche du programme "le plus court" pour calculer une séquence pseudo-aléatoire. Et la complexité de Kolmogorov est indécidable à calculer en général.
Comme Gilles le fait remarquer dans un commentaire, il existe des RNG basés sur le matériel et construits à partir de processus électroniques physiques tels que ceux liés au bruit quantique. ceux-ci, s'ils sont correctement conçus, sont incassables.
la source
En fait, tout ce qu'un ordinateur classique fait est déterministe, en ce sens que lorsque vous lui donnez des tâches, il les suit de manière déterministe. Par conséquent, si vous voulez avoir un nombre aléatoire, vous pouvez le calculer en fonction de l'heure (en fonction de l'heure d'entrée de l'utilisateur), mais si vous voulez avoir un ensemble de nombres aléatoires, vous ne pouvez pas utiliser l'heure pour les nombres suivants, car le les chiffres ne seraient plus indépendants.
Ce que les gens font est d'utiliser des générateurs pseudo-aléatoires qui ont une graine, c'est-à-dire un nombre qui est utilisé pour calculer tous les nombres du générateur de nombres pseudo-aléatoires (dans certains cas plus sophistiqués de simulation ou d'autres tâches, plus de graines peuvent être nécessaires , si plusieurs ensembles de nombres aléatoires indépendants sont nécessaires). La valeur de départ est généralement 0 ou un nombre spécifique si vous voulez des résultats reproductibles, ou le temps si vous et différents résultats non reproductibles.
Le fait que les générateurs de nombres pseudo-aléatoires soient suffisamment bons réside dans le fait qu'ils suivent "les caractéristiques de base d'une génération de nombres pseudo-aléatoires", afin d'être calculés efficacement et de se comporter comme de vrais nombres aléatoires:
À partir de chaque numéro de la séquence de nombres pseudo-aléatoires, un nouveau nombre est calculé (généralement nous travaillons avec des entiers). Cependant, il existe une période, n, dans une séquence de générateurs de nombres pseudo-aléatoires prêts à fonctionner dans une base spécifique avec un nombre fini de bits disponibles pour exprimer les nombres (par exemple binaire). Si ce n n'était pas assez grand, il y aurait de graves problèmes, mais ne vous inquiétez pas, les informaticiens choisissent bien les graines et autres paramètres des générateurs pseudo-aléatoires, afin d'avoir un bon n.
Par exemple, un générateur de nombres pseudo-aléatoires possible, avec la méthode congruentielle linéaire, qui est l'un des algorithmes de générateurs de nombres pseudo-aléatoires les plus anciens et les plus connus peut être défini en conséquence:
il a quatre valeurs:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0, où:
x0 est la valeur initiale, a, c et m sont des constantes où: m> a, m> c, et il produit la séquence avec la fornula:
x_ {i + 1} = (a * x_i + c) MOD m
Les valeurs de ces constantes doivent être soigneusement choisies. Une possibilité est:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, réf. [1-2]
Il existe d'autres algorithmes plus sophistiqués pour générer des nombres aléatoires, qui évitent certains des problèmes des algorithmes précédents, notamment: [3]
À l'avenir, les ordinateurs classiques peuvent être unis à des systèmes quantiques qui peuvent fournir des nombres vraiment aléatoires et les délivrer. [4]
références:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H., et al. (1992). "Recettes numériques dans fortran 77: L'art du calcul scientifique" (2e éd.). ISBN 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /
la source