Frage

Derzeit Erhöhung nur implementiert die random_device Klasse für Linux (vielleicht * nix-Systeme). Kennt jemand bestehende Implementierungen für andere OS-es? Idealerweise würden diese Implementierungen sein Open-Source.

Wenn keine vorhanden ist, wie soll ich mich über als auch Mac OS X ein nicht-determinis RNG für Windows zu implementieren? Gibt es API-Aufrufe in beiden Umgebungen, die diese Funktionalität bieten würde? Dank (und sorry für alle Fragen)!

War es hilfreich?

Lösung

Auf MacOSX, können Sie / dev / random (da es ein * nichts).

Unter Windows, möchten Sie wahrscheinlich die CryptGenRandom Funktion. Ich weiß nicht, ob es eine Implementierung von boost :: random_device ist, die es verwendet.

Andere Tipps

Abhängig von, was Sie wollen für Sie RNG verwenden.

Generell werden Sie Seed-Daten in einen Puffer füttern, Hash-Werte des Puffers erzeugen, einen Zähler in das Ergebnis mischen und es einige weitere Hash. Der Grund für die Verwendung einer Hash-Funktion ist, dass eine gute Hash-Werte zufällig aussehende Ergebnisse von Eingangsdaten zu erhalten sind so konzipiert, dass mehr strukturiert ist.

Wenn Sie es für Kryptographie verwenden möchten, things'll drehen viel haariger. Sie müssen durch mehr Reifen springen, um sicherzustellen, dass Ihre RNG sich wiederholende Muster innerhalb der Sicherheitsgrenzen hält. Ich kann Bruce Schneier „Practical Cryptography“ (für eine Einführung auf RNGs und eine Beispielimplementierung) empfehlen. Er hat auch einige RNG-related stuff up über seine Schafgarbe RNG.

Wenn Schub beruht auf / dev / random, stehen die Chancen, es auf MacOS funktioniert auch (wie es ist, dass).

Unter Windows gibt es CryptoAPI als Teil des OS, und dass eine Krypto Qualität RNG.

Ich glaube auch, modernes Intel-CPUs ein Hardware-RNG auf dem Chip hat - aber Sie Figur müssen, wie auf jedes O an, dass zu bekommen. den höheren Level-APIs ist wahrscheinlich eine bessere Wette.

edit: Hier ein Link , wie der Intel RNG arbeitet

OpenSSL hat eine anständige ein.

#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need

int success = RAND_bytes(...);
if (!success) die_loudly();

RAND_cleanup(); // after you don't need any more numbers

Microsoft Crypto-API hat ein auf Win32. Es erfordert ein paar Funktionsaufrufe. Ohne die Details hier, weil es 2 bis 5 args zu jedem dieser Anrufe. Seien Sie vorsichtig, CryptoAPI scheint damit der Benutzer sich ein komplettes lokales Profil haben. (C: \ Dokumente und Einstellungen \ Benutzer \ Lokale Einstellungen) korrekt konfiguriert, bevor er Sie eine Zufallszahl geben kann

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top