2013-03-14 43 views
3

有誰知道符合上述所有條件的算法嗎?我需要指定一個種子編號,以及我希望輸出數字落入的範圍(這也將是輸入數字所在的範圍)。這個功能還需要有一個能夠逆轉操作的對手。非常大的數字的數字可逆僞隨機數發生器

例如:

我通過種子5和範圍5-35,然後我收到的號碼27。我可以再通入該反轉操作時,使用相同的範圍內的功能這一點,即會給我5號回來。

我不能存儲原始數字,也不能遍歷輸入數字的列表。這不一定是加密強度,它必須儘可能快。

我能想到的唯一符合這種描述的是加密算法。即使在正確的方向一個點將是真棒。

編輯

我試圖找到一種方式來表示一組隨機的(看)的數字過大的內存來保存(可能3E12號),然後測試,如果數字的一定範圍內出現的在那一套。例如

。如果我有一個函數給我隨機集合(4,22,7,343,67,38,2),我想能夠說,給我從1到30之間的數字,以及拿回集(4,22,7,2)。

+0

請你可以編輯問題來解釋你正在努力達到的目標嗎?我已經發布了一個答案來解釋爲什麼你所要求的是不可能的。 – 2013-03-14 15:54:52

+0

我編輯了這個問題。另外,我想過一種方法來做我以前所要求的依賴於隨機數生成器的方法。問題是它不會真正幫助。 – Patrick 2013-03-14 16:45:21

+0

沒關係,我的方式不會工作,它依賴於每個隨機數字的相同種子,這不會給一組隨機數字......這是比我想象的更加棘手的破解。 – Patrick 2013-03-14 16:51:44

回答

1

正如RB所說,你需要一個加密,而不是一個RNG。對於給定的密鑰,加密是可逆的。如果您想要改變範圍的相同種子的不同結果,關鍵可以包含種子和範圍。

範圍大小是一個不同的問題。對於32位的範圍使用DES。對於64位使用AES。對於其他範圍,您可以編寫自己的簡單Feistel cypher或使用Hasty Pudding cypher,它是爲所有尺寸定義的。

無論您使用底層的暗號,你可以隨時使用查找在適當範圍內的一些鼕鼕布丁方法:只要保持encyphering輸出,直到它在要求的範圍內。一旦你有適當的大小的東西,你可以添加下限返回到你所需的數字。因此,對於你的5〜35範圍內,你會產生[0..30]一個號並添加5

ETA:具有想過你的問題有點多,你不能使用作爲種子的一部分鑰匙。如果你這樣做,你將無法重建密鑰來解密你的隨機數。您只能使用密鑰中的數據,當您啓動開始時,您會知道反轉該過程。

你還需要一種方法來識別種子,當你來到它。當你解密時,你會得到一系列數字;你需要一種方法來挑選哪一個是原始種子。也許你可以限制種子在指定的範圍內(或者它的基於零的等價值),並選擇屬於正確範圍的解密序列中的第一個。

+0

啊,這就是我一直在尋找的東西,看起來他們會解決我的問題。謝謝。 – Patrick 2013-03-14 17:04:33

+0

@Patrick:順便說一句,你要找的是一個通用的術語[保留格式的加密](http://en.wikipedia.org/wiki/Format-preserving_encryption)。 – 2013-03-14 19:51:23

0

不,這是不可能的。一個隨機數發生器可以從多個不同的種子產生相同的輸出(在這方面,它就像一個哈希算法,從不同的輸入產生相同的輸出)。

例如,PRNG可能像這樣工作(僞代碼):

PRNG randomWithSeed5 = new PRNG(seed: 5); 
PRNG randomWithSeed6 = new PRNG(seed: 6); 
PRNG randomWithSeed7 = new PRNG(seed: 7); 

randomWithSeed5.NextInt(range: 5-50); //returns 20 
randomWithSeed6.NextInt(range: 5-50); //returns 20 
randomWithSeed7.NextInt(range: 5-50); //returns 32 

在這一點上,很明顯,這是不可能寫一個解碼算法,考慮到20的輸入,可能返回正確的種子 - 你不能決定是否56是正確的答案。

這聽起來像一個加密算法會更好地匹配您的需求 - 我甚至不明白爲什麼涉及隨機數發生器。