Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Zufallszahlen verwenden

von RedakteurnemoredSeite 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 Externer Link!/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 Externer Link!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 BefehlsreferenzeintragRANDOMIZE.

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 03.09.2011 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 30.11.2020 von Redakteurnemored gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen