2016-09-19 84 views
0

我最近玩過Random課,想到了「扭轉」種子過程。
例如:種子10000生成此數據集:0x32 0xb3 0x84 0xf5 0x30獲取特定數據集的種子

Random random = new Random(10000); 
byte[] storage = new byte[5]; 

random.NextBytes(storage); 

我的問題是,是否有可能獲得一個給定數據集的種子。
是這樣的:var seed = GetSeed(new byte[] { 0x32, 0xb3, 0x84, 0xf5, 0x30 }); // returns 10000

我敢肯定,這是不可能的(在某種程度上就像是不可能恢復的散列以它的源文本),但也許我錯了。

+0

如果你想逆向工程,這裏是Random.cs源代碼:http://referencesource.microsoft.com/#mscorlib/system/random.cs – Magnus

+0

看看這個構造函數,你會注意到它不能逆轉:http://referencesource.microsoft.com/#mscorlib/system/random.cs,92e3cf6e56571d5a,references –

+1

你必須嘗試每種可能的種子。 – jdweng

回答

2

只需嘗試所有可能的種子,就可能發出警告(見下文),甚至沒有窺視實施。它們的數量有限,所以這絕對是可計算的。其實它不會花很長時間,只有大約20億(否定種子被否定)種子。

需要注意的是,多個實際上不同種子(所以忽略負種子)可以生成一個開始相同的序列。對於顯而易見的情況,考慮一個字節的序列 - 有比256更多的種子,因此它們必須被重用。更長的序列可能會變得不吉利。

莫名其妙地喜歡它,是不可能恢復的散列以它的源文本

您可以生成同樣的方式散的原像,只是嘗試一切(所有字符串,開始與短的 - 而無限多的字符串,你會發現在有限的時間匹配,如果合理的假設散列函數保持)。不同之處在於哈希值越大,所需時間就越長。當然,多個字符串映射到相同的散列,這並不意味着您會找到原始文本,但理論上,您可以找到與原始文本「一樣好」的文本。