Hash

會不會有浮點 CSPRNG?

  • January 3, 2021

我最近對是否有浮點 CSPRNG 的回答是否定的?我的推理是不可預測的捨入誤差,尤其是在不同的硬體上。

在其最基本的形式中,可以通過安全地散列隨機啟動的計數器來構造 CSPRNG。這就是 Java 的安全隨機函式內部發生的情況。因此,如果我們能找到一個對浮點數進行運算的雜湊,我們就會得到一個最初要求的浮點 CSPRNG。

以下縮寫摘要來自本文:-

本文展示了其中一個系統如何使用 IEEE 浮點算法以極高的速度散列消息 - 比相同安全級別的先前系統快得多。

我的問題是我無法理解工作。這對我來說都是希臘語,但我可以發現 0.98 、 2.2 和 1.01 的乘數,它們顯然是浮點數。

我錯了嗎,浮點 CSPRNG 如果不常見,實際上是可能的?

澄清: 出現了一些僅與非確定性 RNG 或生成浮點輸出相關的評論。最初的問題要求使用本機浮點確定性生成器。所以在內部它應該只適用於浮點數,(我認為)我的連結論文也是如此。它澄清了關於我正在尋找的連結文件的最後一個事實,因為這將為本地浮點 CSPRNG 鋪平道路。

附錄

我現在遇到了Uni64(),它是一個使用雙精度變數的隨機數生成器。這是喬治·馬薩利亞的作品。這是初始化的摘錄:-

const double r=9007199254740881.0/9007199254740992.;
const double d=362436069876.0/9007199254740992.0;
static double c=0.; static int i=97,j=33; double x;

毫無疑問,r,d 和 c 是雙精度變數。例如,r = 999.999999999987676524e-3 和 d = 40.2384869730987304592e-6。老實說,我不知道這意味著什麼。r 是否意味著 1 我已經四捨五入,或者它是正確的?不知道 d 可以四捨五入。

“uni64() 雙打乘以 2^53”

這是秘密嗎?舍入/累加錯誤確實會按預期發生。但是通過左移 53 次,它們有效地成為低有效位隨機性的一部分。看似隨機的精度誤差成為隨機性的一部分。如果是這樣,這似乎是一個浮點隨機數生成器……

我認為這是一個問題,像“CSPRNG”這樣的常用術語的歧義會妨礙這個問題。問題在於,當在不同的上下文中談論“CSPRNG”時,人們會以不同的方式指代:

  1. 在給定相同輸入時必須產生相同結果的確定性算法。範例:流密碼,如果 Alice 和 Bob 要成功通信,他們必須產生相同的密鑰流。
  2. 沒有此類要求的非確定性算法,理想情況下可以由真正的隨機生成器代替。範例:作業系統隨機生成器,其中實際的解決方案是組合一個具有物理雜訊源的確定性偽隨機生成器,以產生確定性和偽隨機的輸出。

不可預測的捨入誤差對於#1 來說是個問題,但對於#2 來說可能不是這樣。如果是後者,那麼浮點數只是位串,浮點運算只是位串運算;關於建構反模式“CSPRNG”的問題是,是否有辦法將這些操作組合成一個加擾函式,從而產生一些對密碼分析者的最大努力有抵抗力的東西。

引用自:https://crypto.stackexchange.com/questions/48727