Frage - nächste Zufallszahl vorhersagen/berechnen?

404

0
ich hab neulich das in einem Post hier auf n board gelesen:

Orginal von Elderan
Ein Computer kann keine Zufälligen Zahlen genieren, denn es ist und bleibt eine Rechenmaschiene die nichts anderes kann als Rechnen. Und was man ausrechnen kann, ist nicht Zufällig.

Meine Frage:

Ist es möglich, die nächste Zahl einer Random Funktion wie z.B. die rand() Funktion in PHP als nächstes ausspuckt, zu berechen & so vorherzusagen? So wie ich das jetzt verstanden hab, müsste es möglich sein, wenn man den Algorhytmus knackt, nach dem die Random Funktion arbeitet? X( Wenn ja, wie müsste so ein Code dann aussehen? ?(

THX. Würde mich echt mal interessieren. :rolleyes:

cya & gn8
 
Hallo,

Wofür ist den die Zufallsfunktion gut? Das du die nächsten Zahlen eh schon weisst? :rolleyes:
 
wiso algorithmus knacken?!? ist der zufallsalgorithmus nicht hinlänglich bekannt?!? das problem dürften eigentlich nur sein, die gleichen eingabeparameter zu finden...
 
falls php auf das den kernel zurückgreift, wirds unmöglich, wenn man sich die beschreibung durchlest:

Code:
cat /usr/src/linux/drivers/char/random.c

* Theory of operation
* ===================
*
* Computers are very predictable devices. Hence it is extremely hard
* to produce truly random numbers on a computer --- as opposed to
* pseudo-random numbers, which can easily generated by using a
* algorithm. Unfortunately, it is very easy for attackers to guess
* the sequence of pseudo-random number generators, and for some
* applications this is not acceptable. So instead, we must try to
* gather "environmental noise" from the computer's environment, which
* must be hard for outside attackers to observe, and use that to
* generate random numbers. In a Unix environment, this is best done
* from inside the kernel.
*
* Sources of randomness from the environment include inter-keyboard
* timings, inter-interrupt timings from some interrupts, and other
* events which are both (a) non-deterministic and (b) hard for an
* outside observer to measure. Randomness from these sources are
* added to an "entropy pool", which is mixed using a CRC-like function.
* This is not cryptographically strong, but it is adequate assuming
* the randomness is not chosen maliciously, and it is fast enough that
* the overhead of doing it on every interrupt is very reasonable.
* As random bytes are mixed into the entropy pool, the routines keep
* an *estimate* of how many bits of randomness have been stored into
* the random number generator's internal state.
*
* When random bytes are desired, they are obtained by taking the SHA
* hash of the contents of the "entropy pool". The SHA hash avoids
* exposing the internal state of the entropy pool. It is believed to
* be computationally infeasible to derive any useful information
* about the input of SHA from its output. Even if it is possible to
* analyze SHA in some clever way, as long as the amount of data
* returned from the generator is less than the inherent entropy in
* the pool, the output data is totally unpredictable. For this
* reason, the routine decreases its internal estimate of how many
* bits of "true randomness" are contained in the entropy pool as it
* outputs random numbers.
*
* If this estimate goes to zero, the routine can still generate
* random numbers; however, an attacker may (at least in theory) be
* able to infer the future output of the generator from prior
* outputs. This requires successful cryptanalysis of SHA, which is
* not believed to be feasible, but there is a remote possibility.
* Nonetheless, these numbers should be useful for the vast majority
* of purposes.
 
Hallo,
sobald man die Startzahl kennt, kann man die Zahlen vorhersagen.

PHP:
<?php
srand(12345);
for($i=0;$i<10;$i++)
   echo rand(0,100)."<br>";
?>

Dieser Script gibt dir immer die gleichen Zufallszahlen aus, denn der Startwert ist immer die gleiche (12345).

Wenn man jetzt den Startwert kennt, kann man also die "Zufallszahlen" voraussagen.

Kennt man nur die Zufallszahlen, dann kann es u.U. sein, dass man über die Zufallszahlen an den Startwert. Solche Algorithmen nennen sich dann: Kryptographisch unsicher.

Des weiteren wenn man folgenden Startwert bentutzt:
mt_srand((double)microtime()*1000000); (da seed = int ist)

Dann gibt es max. 1 Millionen mögliche Startwerte. Lässt man jetzt so ein zufälliges Passwort erstellen, dann gibt es max. 1 Mio. Passwörte, die man doch relativ schnell durchtesten kann, sogar über das Internet (bei 100 Passwörter/Sek dauert es ca. 2 Stunden).
Also zur Erstellung eines PW sehr ungeeignet, dieses Verfahren.

Die PHP rand() Funktion benutzt den in der jeweiligen libc enthaltenen Zufallsgenerator. Gerade in älteren libc-Versionen ist dieser aber oft langsam und die Qualität der erzeugten Pseudozufalls-Sequenzen ist unbefriedigend bis unbekannt.
PHP-Manual

Laut Bruce Schneier in "Angewandter Kryptographie", sind die enthaltenen Zufallsgeneratoren in Compilern/C-Libs meistens extrem schlecht und unsicher und lassen sich relativ leicht knacken, deswegen rät er ab, die fertige rand() Funktion von deinem C-Compiler zu verwenden.

Unter Windows lasse ich mit PHP z.B. ein Bild erzeugen, dabei werden mit rand() "zufällige" Punkte auf dem Bild eingezeichnet.
Allerdings sind diese Punkte gar nicht zufällig, sondern ergeben ein schönes Streifenmuster. Unter Linux sah dies anders aus. (Siehe Anhang PHP Code)

Dann gibt es noch die mt_rand() Funktion, die auf den "Mersenne Twister" zurückgreift.

Unlike Blum Blum Shub, the algorithm in its native form is not suitable for cryptography
Wikipedia


Also sind die Algorithmen an sich schonmal nicht kryptographisch sicher.


Dann kommt noch die falsche Handhabung
So dann gab es dort noch die "Netscape Story":
Ein reduzierter Schlüsselraum wurde Mitte 1995 bekannt im bekannten Browser Netscape.
Wenn man z.B. Kreditkartennummern chiffriert senden möchte, erzeugt das Programm einen 128 Bit langen Sitzungsschlüssel. Innerhalb der USA drufte nur effektiv 40 Bit des Schlüssels benutzt werden.
Selbst 2^40 ist eine ordentliche große Zahl, ca. 10^12 oder 1 Billionen (Anmerkung: Heutzutage in ca. 1 Tag geknackt) wäre ein damaliger PC rund 12 Tage beschäftig.

Doch der (Pseudo)Zufallsgenerator für den Sitzungsschlüssel von Netscape war wenigstens unter den UNIX-System Solaris und HP-UX nicht zufällig genug. Er wurde mit einer Größe initialisiert, die von der Systemzeit abhing (auf Mikrosekunden genau gemessen) sowie von den Identifikationsnummern des aktuellen und des Elternprozesses (den PID und PPID).
Daraus ergibt sicht eine Varianstionsbreite/Startwerte von 10^18 Möglichkeiten.
Wenn jedoch jmd. Zugang zu dem gleichen Rechter hat, dann kann er die PID und PPID des Anwenders sehr leicht bestimmen, und die Systemzeit wird er mindestens mit Minutengenauigkeit ermitteln können.
Es bleiben wenige zig Millionen Möglichkeiten übrig (10^7).
Um den Faktor 10^11 - also 100 Mrd. - hat sich hier die Variationsbreite verkleinert!

Und bei nur 1000 Versuchen pro Sekunde (Elderan: Heutige PC's schaffen 15 Mio Keys/Sek) wäre ein Rechner nach drei Stunden fertig!.

Doch die Praxis ist noch schöner: Oft genug kann man in einem Rechner die Zeit gar nicht auf die Mikrosekunde genau messen, sodern z.B. nur in 10ms-Intervallen.
Dann hat man noch einmal vier Größenordnungen gewonne, der Rechner arbeitet nur noch 10 Sekunden. Der volle Brute Force angriff auf den 40 Bit Key mit 1000 Versuche pro Sekunde hätte volle 30 Jahre gedauert.

....
Netscape behob den Fehler umgehened.

Quelle: Abenteuer Kryptologie ISBN: 3 -8273-1815-7


Anhang:
PHP:
<?php
//Code entweder mit code.php?method=rand oder mit 
//code.php?method=mt_rand aufrufen

//Ergebnis hängt je von der rand Funktion eurer Lib ab.

mt_srand((double)microtime()*1000000);
srand((double)microtime()*1000000);


$image = imagecreate(1000,650) OR die("Fehler beim Erstellen des Bildes");
$farbe_body=imagecolorallocate($image,210,210,210);

if($_GET["method"] == "rand") $farbe_pixel = imagecolorallocate($image,255,0,0);
else $farbe_pixel = imagecolorallocate($image,0,0,255);


for($i = 0;$i<7000;$i++) {
   if($_GET["method"] == "mt_rand") {
   	$x = mt_rand(0,1000);
   	$y = mt_rand(0,650);
    } else {
   	$x = rand(0,1000);
   	$y = rand(0,650);
    }

   imagesetpixel($image, $x, $y, $farbe_pixel);
}

header("Content-Type: image/png");
imagepng($image);

?>
 
Zurück
Oben