Tutorial
Zufallszahlen verwenden
von nemored | Seite 5 von 5 |
Ausblick: "echte" Zufallszahlen
Der Mersenne-Twister-Algorithmus liefert hochgradig gleichverteilte Werte, eignet sich also hervorragend dafür, zufällige Ergebnisse zu simulieren. Allerdings lässt sich auf Dauer gesehen anhand der bisher erzeugten DOUBLE-Werte der "Zustand" des Generators bestimmen und dadurch die folgenden Werte errechnen. Für sicherheitsrelevante Fragen, etwa kryptographische Anwendungen wie die Erzeugung eines Schlüssels, reichen die in FreeBASIC mitgelieferten Möglichkeiten (in Reinform) also nicht aus.
Um kryptographisch sichere Zufallszahlen zu erzeugen, greifen viele Anwendungen daher auf Benutzereingaben (etwa die Mausbewegung) oder das Umgebungsrauschen von Gerätetreibern zurück. Unter unixartigen Betriebssystemen gibt es mit der Datei /dev/random bereits eine einheitliche Schnittstelle für "echte" Zufallszahlen. Auf die Datei kann wie gewohnt zugegriffen werden:
' Achtung: funktioniert nur auf UNIX-artigen Systemen!
DIM AS INTEGER f = FREEFILE, zufallszahl
OPEN "/dev/random" FOR INPUT AS #f
FOR i AS INTEGER = 1 TO 3
' hier wird eine INTEGER-Zufallszahl ausgelesen
' möglich wären aber auch andere Datentypen
GET #f,, zufallszahl
PRINT zufallszahl
NEXT
CLOSE #f
SLEEP
Die Methode liefert nur so lange Ergebnisse, wie für eine ausreichende Zufälligkeit gesorgt ist. Danach blockiert /dev/random den Zugriff solange, bis wieder genügend Daten anliegen. Ein paar Tausend Zufallszahlen aus der Datei zu holen kann daher unter Umständen ziemlich lange dauern. In der Praxis wird daher die "echte" Zufallszahl nur als Startwert für den Pseudozufallsgenerator genutzt. Mit diesem sollten dann aber nicht zu viele Werte hintereinander erzeugt werden, um eine Berechenbarkeit zu vermeiden.
Windows stellt mit CryptoAPI einen ähnlichen Mechanismus zur Verfügung, der hier kurz vorgestellt werden soll:
' Achtung: funktioniert nur auf Windows-Systemen!
' Benötigte Windows-Header
#Include Once "windows.bi"
#Include Once "win/wincrypt.bi"
' Variablen für die Initialisierung des Cryptographic Service Providers
Dim As HCRYPTPROV hCryptProv = NULL
' Union zur einfachen Verwaltung der Zufallszahl
Union zufallsZahlUnion
As Byte zahlByte(4)
As Integer zahl
End Union
Dim As zufallsZahlUnion zufallsZahl
' Initialisierung des Cryptographic Service Providers
If CryptAcquireContext(@hCryptProv, NULL, 0, PROV_RSA_FULL, 0) = TRUE Then
' Anforderung einer Zufallszahl
If CryptGenRandom(hCryptProv, 4, @zufallsZahl.zahlByte(0)) = TRUE Then
Print "Die Zufallszahl ist:", zufallsZahl.zahl
' Cryptographic Service Provider schließen
If CryptReleaseContext(hCryptProv, 0) = TRUE Then
Print "Cryptographic Service Provider geschlossen."
Else
Print "Konnte Cryptographic Service Provider nicht schliessen."
EndIf
Else
Print "Keine Zufallszahl erhalten."
EndIf
Else
Print "Fehler beim Initialisieren des Cryptographic Service Provider:", GetLastError()
EndIf
Sleep
Ab FreeBASIC Version 0.24 ist ein neuer Algorithmus verfügbar, der die eben genannten Methoden verwendet, um echte Zufallszahlen zu erzeugen. Näheres dazu findet sich im Referenzartikel zu RANDOMIZE.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|