PCG PRNG 是 CSPRNG,還是為什麼不呢?
PCG 系列 PRNG 算法在密碼學上是否安全?如果不是,它們又如何使它們無法滿足要求?
我對一般問題空間有足夠好的理解,如果你提到“回溯阻力”之類的東西並給出一個句子總結它的含義,我可以將這些點連接起來,以理解為什麼它對安全很重要。
我對製作加密安全 PRNG 需要什麼有一個(可能不完整)的理解——例如,我知道對可預測性或回溯的抵抗很重要,理想情況下,即使攻擊者了解了更多 PRNG 的輸出或學習了一些PRNG 的內部狀態。
但我缺乏自己實際評估 PRNG 所需的深厚經驗和知識,以確定它們是否符合這些屬性中的任何一個,或者確信我沒有錯過任何東西。
我確實知道 PCG 的設計並不適合密碼學——它似乎已經針對良好的統計特性和產生輸出的效率進行了優化。
我還發現有人說 PCG 在密碼學上不安全。
但是我沒有找到對 PCG 的任何實際分析——任何解釋它未能滿足哪些屬性的文章,等等。
我對其進行了更多研究,並且有一種具有 128 位狀態的 PCG 類型,其中輸出與內部狀態略微分離。
PCG 是一套生成偽隨機數的算法,這些偽隨機數是在現有輕量級隨機數生成器之上創建的,因此它們:
- 保持輕盈;
- 通過各種統計隨機性測試;
- 可能更難以預測。
現在只有第 3 部分與密碼學有關。然而,除了一種算法之外,所有算法似乎都處於 64 位或更少的狀態(如果我不考慮作者認為不安全的算法)。這使得它們直接不適合加密隨機數生成。
這給我們留下了 PCG-XSL-RR,這是唯一一個聲稱是安全的。這似乎是通過在狀態上添加 XorShift 和一些非常簡單的操作來導出狀態的輸出來完成的:
output = rotate64(uint64_t(state ^ (state >> 64)), state >> 122)
儘管肯定有非常簡單的流密碼,但在我看來,我們需要分析以查看是否不能使用許多輸出來導出狀態位。只要不執行該分析,僅僅說明它可能是安全的,並且預測難度是“具有挑戰性的”並不能構成密碼安全算法。
因此,個人稱其為“安全”是沒有根據的。將預測難度列為“具有挑戰性”,意思是用狡猾的詞來表示沒有進行充分的分析,算法的安全性是未知的。如果可以檢索到狀態,那麼算法畢竟是完全可預測的。在不知道這種未知攻擊需要多少輸出的細節的情況下,我們怎麼能相信這種說法呢?
現在那是非黑即白的,甚至指責作者的陳述不正確。但是,我們必須考慮算法作者所做的所有陳述,以至少部分免除她的責任:
我知道如果我試圖預測一個隨機數生成器,我會想要比 PCG 系列更簡單的東西。但是,如果我想要真正的加密安全來進行安全通信,我可能想要使用一些已經存在更長時間並且受到更多審查的東西。
希望隨著時間的推移,PCG 生成方案將受到比我在密碼安全方面更專業的人的審查,並且我們將更清楚地了解它是多麼容易被預測。考慮到這一點,我希望在未來提供一些密碼安全挑戰,以鼓勵人們嘗試破解它。
所以請認為它是不安全的,直到分析表明不是這樣,並且可能使用一個生成器,其中“密碼”和“安全”這兩個詞拼寫正確,最好是附上“分析”這個詞……