Comment peut-on détecter qu'un générateur de nombres n'est pas vraiment aléatoire?

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é?

URL87
la source
1
Ce message peut vous aider.
Anton
6
Au risque de paraître pédant, il n'est pas vraiment possible de dire avec certitude qu'une source donnée n'est pas aléatoire, si vous ne faites qu'examiner ses sorties. Vous pouvez lancer une pièce de juste fois d'affilée et obtenir la tête à chaque fois, et vos chances d'obtenir des queues sur les 10 100 + 1 er tirage au sort est encore 50%. En examinant la source, nous pouvons généralement identifier des choses non aléatoires (par exemple, des générateurs de nombres pseudo-aléatoires ... nous pourrions prédire la séquence à partir de la graine et de l'algorithme). De nombreuses sources apparentes de hasard ne sont tout simplement pas suffisamment comprises pour pouvoir prédire de manière fiable. C'est philosophique, cependant. dix100dix100+1
Patrick87
@ Patrick87 Si avec "certitude" vous voulez dire mathématiquement, c'est vrai. Il existe cependant des tests statistiques qui peuvent vous donner une signification arbitraire (à condition que les données soient «bonnes»).
Raphael
@ Patrick87 Au risque de paraître banal ... vous dites "Vous pouvez lancer une pièce de monnaie équitable fois de suite et obtenir des têtes à chaque fois" ... non, je ne peux pas. Tout modèle qui me permet de voir même 10 3 têtes d'affilée et de croire que c'est une pièce équitable ne capture pas très bien la réalité. C'est en effet philosophique, cependant. ;-)dix100dix3
Don Hatch

Réponses:

15

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?

1n

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.

SamM
la source
7
C'est une bonne réponse (mais incomplète) dans l'ensemble, mais quelques points sont faux. «Le véritable caractère aléatoire est impossible pour les ordinateurs, car tout ce qu'ils font est déterministe.» Ce n'est pas toujours vrai, certains processeurs incluent un RNG matériel. Les ordinateurs peuvent également réagir à une entrée externe qui peut être aléatoire. «… Pour la cryptographie, donc nous ne nous soucions pas vraiment de la façon dont ils sont« aléatoires »en termes de distribution»: en fait, parfois une distribution uniforme est importante en crypto, par exemple l'IV pour CBC et le paramètre k dans DSA.
Gilles 'SO- arrête d'être méchant'
Il a écrit: "Sans ajout extérieur, tout ce qu'un ordinateur fait est déterministe". L'addition extérieure fait référence à des appareils tels que les RNG comme vous le mentionnez. Sans ces ajouts, nos capacités de calcul sont égales à celles d'une MT pour laquelle le vrai hasard est impossible.
Kent Munthe Caspersen
Si je me souviens bien, j'ai ajouté cela après le commentaire de Gilles.
SamM
4

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

Vor
la source
3

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.

Raphael
la source
0

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.

vzn
la source
"Les PRNG non triviaux sont construits de sorte que leurs algorithmes ne puissent pas être détectés (dérivés)" - je ne pense pas que ce soit vrai. En fait, votre phrase suivante la contredit. Souhaitez-vous modifier votre réponse pour résoudre ce problème?
DW
il pourrait être étoffé de façon plus précise mais pas suivante, quelle est votre objection spécifique? le fait est que l'algorithme qui génère la séquence ne peut pas être déterminé uniquement à partir de la séquence de données uniquement, sauf par force brute, si l'algorithme est sécurisé, et la force brute a peu de chances de réussir dans ce cas.
vzn
1
Mon objection spécifique est que la phrase me semble fausse: on dirait que vous dites que les PRNG sont conçus de sorte que quelqu'un qui observe leur sortie ne puisse pas déduire ce que l'algorithme était, mais ce n'est pas ainsi que les choses fonctionnent dans la vie réelle. La plupart des PRNG ne sont pas conçus pour empêcher quelqu'un d'apprendre l'algorithme; généralement, l'algorithme est public. Peut-être voulez-vous dire que les PRNG sont construits de sorte que leur sortie ne puisse pas être distinguée des bits vrais aléatoires?
DW
1
"l'algorithme qui génère la séquence ne peut pas être déterminé uniquement à partir de la séquence de données uniquement, sauf par force brute, si l'algorithme est sécurisé" - Ce n'est pas correct non plus. L' algorithme est généralement public. Ce n'est que la graine qui n'est pas publique, et c'est seulement la graine qui est censée être difficile à tirer des résultats.
DW
-1

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:

  • les nombres produits doivent suivre une distribution uniforme (à partir de cette distribution, vous pouvez obtenir n'importe quelle autre distribution);
  • les chiffres produits doivent être statistiquement indépendants;
  • la séquence est reproductible (ce point est imposé à cause de cette propriété du matériel d'un ordinateur classique, et c'est pourquoi ils sont appelés "nombres pseudo-aléatoires");
  • la période de la séquence doit être suffisamment longue;
  • la génération des nombres doit être rapide.

À 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]

  • des périodes plus courtes que prévu pour certains États d'origine (ces États d'origine peuvent être appelés «faibles» dans ce contexte);
  • manque d'uniformité de distribution pour de grandes quantités de nombres générés;
  • corrélation des valeurs successives;
  • mauvaise distribution dimensionnelle de la séquence de sortie;
  • les distances entre les endroits où certaines valeurs se produisent sont distribuées différemment de celles d'une distribution de séquence aléatoire.

À 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 /

sissi_luaty
la source
Cela ne répond pas vraiment à la question. Vous expliquez comment générer des nombres aléatoires, pas pour détecter si un RNG donné est aléatoire. Même alors, vos explications manquent quelque peu, les congruences linéaires ne sont guère «l'une des meilleures». Les RNG matériels existent maintenant, il n'y a pas besoin de calcul quantique; il y a de fortes chances que vous en ayez un dans votre PC, un dans votre téléphone et même un dans votre carte de crédit.
Gilles 'SO- arrête d'être méchant'