Baue gerade eine kryptographische Anwendung und benötige dafür eine ganze Menge möglichst gleichverteilter Zufallszahlen mit dem Wert 0 oder 1. Die Daten werden in einer for-Schleife erzeugt und im Moment wird alle 100 Durchläufe der Seed neu gesetzt:
Die Anwendung muss leider unter Windows lauffähig sein, daher kommt die Verwendung von /dev/random nicht in Frage. Gibt es dazu eine gleichwertige Lösung unter Windows oder ist obige implementierung eurer Meinung nach ausreichend?
Die Idee dahinter ist natürlich, dass die Periode des Pseudo-Random-Generators größer ist als 100 in diesem Fall und der jeweils neue Seed (u.a. natürlich bedingt durch die benötigte Rechenzeit) für einen potenziellen Angreifer praktisch nicht in Erfahrung zu bringen ist.
Es gibt in Python zumindest die portable Funktion os.urandom(), welche je nach Plattform entweder /dev/urandom oder die Funktion CryptGenRandom() aus der Windows-API verwendet. Du musst halt selber wissen, ob dir das ausreicht.
@EyDu: Das ist "security by obscurity". Es wird nichts "zufälliger", es wird nur schwerer die Zahlen vorherzusagen. Was man aber nach wie vor kann. Solche Pseudozufallsgeneratoren eignen sich nun einmal nicht für kryptografische Anwendungen.
Und was den Code und dessen Ausgabe betrifft, weiss ich jetzt nicht so ganz welchen Erkenntnisgewinn das bringen soll!?
BlackJack hat geschrieben:@EyDu: Das ist "security by obscurity". Es wird nichts "zufälliger", es wird nur schwerer die Zahlen vorherzusagen. Was man aber nach wie vor kann. Solche Pseudozufallsgeneratoren eignen sich nun einmal nicht für kryptografische Anwendungen.
Da habe ich wohl ein " " vergessen. Ich wollte nur demonstrieren, wie schön man immer wieder die selben Zufallszahlen bekommt, wenn man seed innerhalb von kurzen Zeitabständen aufruft und dabei die Zeit als Parameter verwendet. quant42 erreicht damit also genau das Gegenteil seines eigentlichen Ziels.
@DasIch: Dann kann man "os.urandom()" auch fast immer direkt verwenden und auf den PRNG verzichten. Der negative Einfluss auf die Laufzeitgeschwindigkeit ist fast immer vernachlässigbar.
import random
a = random.SystemRandom()
zahl = a.random()
wäre ich schon ganz gut bedient oder gibt es hier ebenso Einwände gegen eine allzu offensichtliche Sicherheitslücke?
Da die Variable zahl aus dem Intervall [0;1] stammt, würde ich eine Abfrage machen, ob die Zufallszahl größer bzw. kleiner als 0.5 ist. Je nach Ausgang der Abfrage würde dann eine 0 oder 1 als nächstes Bit geschrieben werden. Mein Lemma dabei ist jetzt natürlich, dass die so gewonnenen Zahlen vielleicht nicht gleichverteilt über dem Intervall sind, sodass sich die Wahrscheinlichkeit für den jeweiligen Zustand eines Bits nicht nur vernachlässigbar von 0.5 unterscheidet. Weiß jemand wie "gut" die Verteilung der Zahlen ist?