Cryptanalysis

如果我截斷輸出,Mersenne-twister 加密安全嗎?

  • December 15, 2015

我想創建一個線上輪盤遊戲。如果 PRNG 只在使用者開始遊戲時播種一次,是否可以,或者建議在遊戲期間有時重新播種?也許每天只在伺服器上播種一次,每個玩家都會獲得下一個隨機數而無需重新播種?你會怎麼做?他們如何在網上賭場做到這一點?


請注意,以下編輯不包含有關原始問題的任何相關資訊。之所以保留它,是因為給定的答案已更新以反映此處包含的附加資訊。大多數 - 如果不是全部 - 答案不同意使用 Mersenne Twister 生成安全隨機數的安全性。


編輯(回應評論和答案)

每個人都說我應該使用 CSRNG。我理解為什麼 MT 在密碼學上不安全。

但是伙計們,也許您忘記了我們縮小了範圍,您忘記了輪盤賭我只需要從 0 到 36 的數字。

MT可以生成 $ 2^{32} $ 不同的數字。在輪盤賭號碼之間統一共享這些可能的號碼,我們可以有 $ (2^{32})/37 $ 每個輪盤賭號碼的不同號碼。每個數字都屬於一個州號。MT 用於生成下一個數字,使用具有以下索引的數字: $ i $ , $ i+1 $ 和 $ i+397 $ . 這意味著我們有 $ (2^{32})/37 * (2^{32})/37 * (2^{32})/37 $ 產生下一個狀態的可能性。如果你想破解我的RNG,知道它不是C-secure,你有一台超快的電腦,計算只需要1秒 $ (2^{32})/37 $ 可能性,那麼整個事情仍然需要很長時間,並且您將獲得下一個狀態的大量可能值。

給定少量輸出,計算所有未來輸出相對簡單。

這根本不是真的,因為如果你想要能夠預測所有未來的狀態,你必須計算所有的624個狀態,你只能看到0到36的結果。(我現在不想解釋,但實際上如果我們的範圍縮小,我們需要更多(更多)而不是 624 個州才能獲得一個州的一個數字。)但是假設您想破解 RNG,並且您要求您的朋友計算州的不同部分,你們一起可以很快完成,那麼我有一個竅門:當你轉動輪盤賭的輪盤時,我生成兩個數字,我用一個做輪盤賭,另一個捨棄。RNG 仍然是均勻分佈的,你永遠不可能擁有索引為 i+1 的狀態(因為我丟棄了它),你也無法找出 MT 的狀態。(生成第二個隨機數可以在輪子旋轉時發生,所以我們不會浪費太多時間。)如果我是對的並且它有效,它也可以解決播種問題。這個論點成立嗎?


編輯 2(收到新評論後)

編輯原因:本站的評論和評分最高的答案讓訪問者認為無法修改梅森撚線機以獲得安全輸出。

Matsumoto 先生網站上對 Mersenne twister 的加密安全修改- 他是 Mersenne twister 的兩位創建者之一。檢查此站點上的 C 程式碼,修改是您可以使用種子數組為算法播種。

另一種使 Mersenne twister 加密安全的解決方案(由 Matsumoto 先生編寫):

為了使其安全,您需要在 MT 中使用一些安全散列算法。例如,您可以收集每 8 個字的輸出,並將它們壓縮為一個字(因此輸出序列的長度是原始序列的 1/8)。

在這個論壇上,我們對我的陳述有一個很長的爭論:如果我們隨機隱藏許多 Mersenne twister 的結果並且輸出整數的範圍是有限的,那麼這些修改使 MT 在密碼學上是安全的。如果我的陳述是正確的,那麼您不需要種子數組,並且這種方法比使用散列算法更有效。

**警告:**我沒有進行密碼分析,我只是試圖通過爭論來證明它是安全的,你可以從下面的評論中了解到。如果您不確定它是否有效,請不要使用此方法。儘管如此,從我的角度來看,下面的陳述是正確的:“如果你正確地修改它,Mersenne-twister 可以用於輪盤遊戲。(儘管我們建議使用 CSPRNG。)可以每天用優質種子播種。”

您不想使用 Mersenne Twister 之類的東西進行賭博。它不是加密安全的。

給定少量輸出,計算所有未來輸出相對簡單。這些算法是為諸如蒙地卡羅模擬之類的事情而設計的。

更好的選擇是隨機選擇一個 128 位密鑰並以反模式執行 AES。另一種選擇是簡單地將輸入從/dev/urandom.

其中任何一個都將為您提供可用於遊戲應用程序的安全比特流。

引用雨披的回答

好吧,主要的漏洞是,如果攻擊者獲得了足夠大的 Mersenne Twister 輸出樣本,他就可以預測未來(和過去)的輸出。這嚴重違反了加密安全隨機數生成器應具有的屬性(您甚至無法判斷隨機位串是否可能由相關 RNG 生成)。

換句話說:你不應該在你的項目中使用像 Mersenne Twister 這樣的東西。

有關如果您這樣做可能會出錯的 RealLife™ 範例,您可能需要閱讀 Brad Arkin、Frank Hill 撰寫的文章“我們如何在線上撲克中學會作弊:軟體安全研究”(1999 年 9 月 28 日), Scott Marks、Matt Schmid、Thomas John Walls 和 Gary McGraw 可靠軟體技術軟體安全組。

您需要的是一個加密安全的隨機數生成器。有很多可用的,因此您幾乎沒有理由將其他任何東西用於您的“賭場”目的。實施一個安全和公平的系統並不太難……你的玩家會要求它。


編輯作為對您的編輯的回复

你錯過了重點。只要有人只觀察到週期的一小部分,MT 就可以預測。在那之後,重建整個時期只需要一眨眼的功夫。查看我關於 MWC 的相關問題——它的周期接近創紀錄的……是 Mersenne Twister 的 1033000 倍以上。然而,MWC 也無法為您的項目提供所需的 RNG 安全性。您需要的要點是“不可預測性”,而非 CSRNG 不提供。

此外,攻擊者不需要 624 個連續狀態來打破 Mersenne Twister ……所以丟棄數字不會拯救你。(另請注意,提供的連結僅顯示重建時期的眾多方法之一)。


附錄

由於您似乎已決定只使用 Mersenne Twister,因此我認為您可能會很有趣地了解與它的播種相關的一些陷阱。

/dev/urandomPython 為 Twister 播種 256 位(32 字節)的“真實”隨機性(如果可用,則從中讀取)。這意味著,理論上,知道幾個輸出字節就足以恢復整個狀態,但是攻擊者需要對播種算法進行有效的攻擊,因為 32 個字節幾乎是暴力攻擊的一部分。

然而,其他實現使用更少的隨機性來播種他們的隨機數生成器!例如,PHP 似乎只使用 32 位來播種 mt_random,因為它的 mt_srand 播種函式只接受int. 在這種情況下,攻擊者可能會發現對種子使用暴力攻擊更容易。

由於您沒有指定您計劃使用的程式語言,我只能給您一個一般性警告,即根據程式語言和實現方式,您可能希望更頻繁地重新設定種子,而不是每天一次,以盡量減少暴力攻擊成功的機會。

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