Seite 1 von 1
Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 03:04
von quant42
Moin!
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:
Code: Alles auswählen
import scipy
import time
.
.
.
newSeed = int((time.time()%1)*1000))
scipy.random.seed(newSeed)
.
.
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.
Gruß
quant42
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 06:04
von snafu
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.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 06:22
von BlackJack
Das neusetzen von `seed()` halte ich für Blödsinn.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 07:23
von EyDu
BlackJack hat geschrieben:Das neusetzen von `seed()` halte ich für Blödsinn.
Sag so etwas doch nicht, hier wird der Zufall noch zufälliger gemacht!
Code: Alles auswählen
>>> import scipy
>>> import time
>>> for i in range(100000):
... if i % 1000 == 0:
... scipy.random.seed(int((time.time()%1)*1000))
... print i, scipy.random.uniform()
...
0 0.266462129888
1000 0.266462129888
2000 0.272857802902
3000 0.272857802902
4000 0.214049619411
5000 0.214049619411
6000 0.432131199353
7000 0.432131199353
8000 0.0112657703894
9000 0.0112657703894
10000 0.872934720424
11000 0.43618002509
12000 0.43618002509
13000 0.43618002509
14000 0.43618002509
15000 0.43618002509
16000 0.43618002509
17000 0.731476779637
18000 0.731476779637
19000 0.731476779637
20000 0.731476779637
21000 0.731476779637
22000 0.731476779637
23000 0.231229478708
24000 0.231229478708
25000 0.231229478708
26000 0.231229478708
27000 0.231229478708
28000 0.231229478708
29000 0.231229478708
30000 0.486967032288
31000 0.486967032288
32000 0.486967032288
33000 0.486967032288
34000 0.486967032288
35000 0.486967032288
36000 0.723264498783
37000 0.723264498783
38000 0.723264498783
39000 0.723264498783
40000 0.723264498783
41000 0.723264498783
42000 0.713612483498
43000 0.713612483498
44000 0.713612483498
45000 0.713612483498
46000 0.713612483498
47000 0.713612483498
48000 0.713612483498
49000 0.878945584475
50000 0.878945584475
51000 0.878945584475
52000 0.878945584475
53000 0.878945584475
54000 0.878945584475
55000 0.497778196952
56000 0.497778196952
57000 0.497778196952
58000 0.497778196952
59000 0.497778196952
60000 0.497778196952
61000 0.497778196952
62000 0.11019890983
63000 0.11019890983
64000 0.11019890983
65000 0.11019890983
66000 0.11019890983
67000 0.11019890983
68000 0.0159510745595
69000 0.0159510745595
70000 0.0159510745595
71000 0.0159510745595
72000 0.0159510745595
73000 0.0159510745595
74000 0.105407457482
75000 0.105407457482
76000 0.105407457482
77000 0.105407457482
78000 0.105407457482
79000 0.105407457482
80000 0.105407457482
81000 0.425236143987
82000 0.425236143987
83000 0.425236143987
84000 0.425236143987
85000 0.425236143987
86000 0.425236143987
87000 0.941455743474
88000 0.941455743474
89000 0.941455743474
90000 0.941455743474
91000 0.941455743474
92000 0.941455743474
93000 0.104842526448
94000 0.104842526448
95000 0.104842526448
96000 0.104842526448
97000 0.104842526448
98000 0.104842526448
99000 0.104842526448
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 07:36
von BlackJack
@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!?
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 07:40
von /me
EyDu hat geschrieben:Sag so etwas doch nicht, hier wird der Zufall noch zufälliger gemacht!
Oha, die Ergebnisse des Codes hätte ich nicht erwartet. Das war eine deutliche Warnung.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 08:14
von EyDu
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.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 08:21
von DasIch
/me hat geschrieben:Oha, die Ergebnisse des Codes hätte ich nicht erwartet. Das war eine deutliche Warnung.
Das funktioniert nur wenn man etwas wie Zeit als seed benutzt. Sinnvollerweise nutzt man os.urandom für soetwas.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 08:34
von BlackJack
@EyDu: Ich sollte wohl vor dem Wachwerden noch keine Beiträge verfassen. Oder zumindest nicht vor dem ersten Kaffee. Sorry.

Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 09:40
von lunar
@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.
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 15:33
von quant42
Das Beispiel hat die mangelnde Sicherheit wohl wirklich gezeigt. Denke mit:
Code: Alles auswählen
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?
Re: Zufallszahlen für kryptographische Anwendungen
Verfasst: Mittwoch 14. Juli 2010, 16:17
von Barabbas
SystemRandom()-Instanzen haben auch eine Methode randint():
Code: Alles auswählen
random.randint(a, b)
Return a random integer N such that a <= N <= b.
Schönen Gruß,
brb