2011-10-26 29 views
8

Zastanawiam się, czy istnieje sposób na wykorzystanie nowego, opartego na sprzęcie, prawdziwego generatora liczb, który znajduje się w procesorze Intel? Czytałem, że ta biblioteka MKL (Math Kernel Library) ujawnia tę funkcjonalność, ale wymaga to pakietu MKL i kompilatora intel, kończącego się dość drogo.Korzystasz z prawdziwego generatora liczb losowych na piaszczystym moście?

Czy istnieje inny sposób użycia generatora liczb losowych w moim C++? Na przykład ładna biblioteka tylko z nagłówkiem?

+2

Która platforma systemu operacyjnego? Nie zdziwiłbym się, gdyby był wykonywany automatycznie zarówno w systemie Linux, jak i Windows, w oparciu o możliwości sprzętowe. – unwind

+0

Rozwijam się pod Windows 7, ale mój projekt używa Qt i docelowo docelowo zarówno dla Windows, jak i Linuksa, i jeśli zgodność Qt kakao zostanie wkrótce poprawiona, mam nadzieję, że również MacOS – dtech

+3

Po prostu napisz trochę wbudowanego zestawu do wykonania instrukcji RDRAND. Lub poczekaj na kompilator, aby obsługiwać wewnętrzne. Albo jeszcze lepiej, poczekaj kilka lat, aby uzyskać pewne szanse, że twój użytkownik będzie miał maszynę, która go obsługuje. Podręcznik znajduje się tutaj: http://software.intel.com/file/36945 –

Odpowiedz

0

To może zależeć od systemu operacyjnego. Mogę sobie wyobrazić, że najnowsze jądra GNU/Linux mogą używać sprzętowych generatorów losowych dla np. /dev/random (od strony man random(4) sugeruje, że używa szumu), ale mogę się mylić.

Normalną praktyką jest stosowanie jakiś wspólny generator pseudo-losowych (jak np standardowa funkcja random(3)), ale do materiału siewnego go podczas uruchamiania aplikacji, od jakiegoś bardziej losowego źródła (np czytania /dev/urandom korzystając getpid() i coś z bieżący czas z gettimeofday() itd.).

Bardzo prawdopodobne jest, że uzyskanie bardzo dobrych liczb losowych jest czarną sztuką, przynajmniej dla mnie. Ale powyższe rozwiązanie ma co najmniej tę zaletę, że nie jest łatwo odtwarzalne z jednej aplikacji na drugą.

Jeśli twoja aplikacja jest długotrwała (np. Usługa sieciowa działająca w tym samym procesie przez wiele godzin), być może od czasu do czasu możesz ponownie uruchomić generator liczb pseudolosowych. Jeśli chodzi o serwer sieciowy, wyobrażam sobie, że można również użyć czasów żądań (mierząc je z milisekundową szczegółowością) jako źródła losowości (aby wysiać swój PRNG).

+2

Istnieje wątek o RDRAND i '/ dev/random' tutaj: http://www.spinics.net/lists/linux-crypto/msg05883. html, chociaż nie wiem, czy to, co mówią, jest dokładnie tym, co się wydarzyło lub się wydarzy. Istotą jest to, że masz rację, wygląda na to, że będzie używane jako źródło entropii dla '/ dev/random', chociaż nie jest tak proste, jak'/dev/random' właśnie zwracające wyniki wywołań do RDRAND. –

8

Firma Intel opublikowała instrukcję obsługi ręcznej, biblioteki i kodu dla instrukcji rdrand pod numerem http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide.

Z Readme.

„Ponieważ wielu toolchains kompilator nie obsługują tej nowej instrukcji, ta biblioteka była stworzony w celu ułatwienia dostępu do niego Pomysł jest prosty: link do wbudowany statyczny biblioteka i ciesz się nową funkcją! "

Istnieją przykłady wszystkich wywołań biblioteki w main.c.

Udało mi się skompilować bibliotekę statyczną i program testowy w gcc na Mac OS X. Dokumentacja stwierdza, że ​​jest również kompatybilna z systemami Linux i Windows.

Należy pamiętać, że rdrand jest w rzeczywistości 128-bitowym generatorem liczb pseudolosowych z entropią generowaną sprzętowo. (Nadchodząca architektura Broadwell dostarczy instrukcję rdseed uzyskiwania dostępu do prawdziwego generatora liczb losowych.) Szczegóły różnicy i jej konsekwencje można znaleźć pod nagłówkiem "Long Answer" pod numerem http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed.

1

Oto przykładowy kod:

#include <immintrin.h> 
#include <cstdint> 
... 
uint64_t val; 
if(!_rdseed64_step(&val)) { 
    printf("Error generating hardware random value\n"); 
} 
// Now val contains 64-bit pseudo-random number 

uint64_t val; 
if(!_rdrand64_step(&val)) { 
    printf("Error generating hardware random value\n"); 
} 
// Now val contains 64-bit true random number 

referencyjny: Intel Intrinsics Guide

Powiązane problemy