我想知道是否有一種方法可以使用intel的sandy bridge CPU中發現的基於硬件的真正數字生成器?我讀過英特爾的MKL(數學核心庫)公開了這個功能,但這需要MKL套件和一個intel編譯器,結果非常昂貴。利用沙橋的硬件真隨機數發生器?
是否有另一種方法來在我的C++代碼中使用硬件隨機數生成器? 例如一個不錯的,只有頭文件的庫?
我想知道是否有一種方法可以使用intel的sandy bridge CPU中發現的基於硬件的真正數字生成器?我讀過英特爾的MKL(數學核心庫)公開了這個功能,但這需要MKL套件和一個intel編譯器,結果非常昂貴。利用沙橋的硬件真隨機數發生器?
是否有另一種方法來在我的C++代碼中使用硬件隨機數生成器? 例如一個不錯的,只有頭文件的庫?
它可能取決於您的操作系統。我會想象最近的GNU/Linux內核可能會使用硬件隨機生成器來處理/dev/random
(因爲random(4)
手冊頁提示它使用噪音),但我可能是錯的。
通常的做法是使用一些常見的僞隨機數發生器(如例如random(3)
標準功能),但種子它,開始您的應用程序,從一些隨機源(如使用getpid()
有什麼東西從閱讀/dev/urandom
,當前時間與gettimeofday()
等)。
很可能,獲得非常好的隨機數字是一種黑色藝術,至少對我而言。但是,上述解決方案至少具有不易從一個應用程序運行到另一個應用程序的可再現性的優點。
如果你的應用程序是持久的(例如,一個Web服務在同一個單獨進程中運行了很長時間),你可能會隨時重新生成你的僞隨機數生成器。對於一個Web服務器,我想你也可以使用請求時間(以毫秒粒度度量它們)作爲隨機性的來源(以種植你的PRNG)。
這裏有一個關於RDRAND和'/ dev/random'的文章:http://www.spinics.net/lists/linux-crypto/msg05883。雖然我不知道他們說的是什麼發生或將會發生。要點是你是對的,它看起來好像它將被用作'/ dev/random'的熵源,儘管它不如'/ dev/random'那麼簡單,只是將調用的結果返回給RDRAND。 –
Intel已發佈rdrand
指令的手冊,庫和代碼示例,網址爲http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide。
自述:
「因爲很多編譯工具鏈不支持這種新的指令,該庫是爲了促進輕而易舉地訪問它 的想法很簡單:鏈接到一個內置靜態圖書館,並享受新功能!「
在main.c
中有所有庫調用的示例。
我能夠在Mac OS X上的gcc中編譯靜態庫和測試程序。文檔指出它也與Linux和Windows兼容。
請注意,rdrand
實際上是一個具有硬件生成熵的128位僞隨機數生成器。 (即將推出的Broadwell架構將提供一條rdseed
指令來訪問真正的隨機數生成器。)差異的細節及其含義可在http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed的「長答覆」標題下找到。
下面是示例代碼:
#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
哪種操作系統平臺?基於硬件功能,如果它在Linux和Windows中都自動完成,我不會感到驚訝。 – unwind
我在Windows 7下開發,但我的項目使用Qt,並且最終將同時針對Windows和Linux,並且如果Qt可可兼容性很快就會被修復,那麼希望macOS也是如此 – dtech
只需編寫一些內聯彙編來執行RDRAND指令。或者等待你的編譯器支持本質。或者更好的是,等待幾年,所以你會有一些機會,你的用戶將有一臺支持它的機器。手冊在這裏:http://software.intel.com/file/36945 –