Zufallszahlen für kryptographische Anwendungen

Du hast eine Idee für ein Projekt?
Antworten
quant42
User
Beiträge: 4
Registriert: Mittwoch 14. Juli 2010, 02:55

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

Das neusetzen von `seed()` halte ich für Blödsinn.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
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!?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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

@EyDu: Ich sollte wohl vor dem Wachwerden noch keine Beiträge verfassen. Oder zumindest nicht vor dem ersten Kaffee. Sorry. :oops:
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.
quant42
User
Beiträge: 4
Registriert: Mittwoch 14. Juli 2010, 02:55

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?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Antworten