数字,可逆,伪随机数发生器,用于非常大的数字

时间:2013-03-14 15:39:11

标签: encryption random

有没有人知道适合所有上述标准的算法?我需要指定一个种子数,以及一个我希望输出数字落在下面的范围(也是输入数字所在的范围)。此功能还需要具有反转操作的对应物。

例如:

我传递种子5,范围5-35,然后我收到数字27.然后我可以将它传递给一个反转操作的函数,使用相同的范围,这将给我5号回。

我无法存储原始数字,也无法遍历输入数字列表。这不一定是加密强度,必须尽可能快。

我能想到的唯一适合这种描述的是加密算法。即使是正确方向上的一点也会很棒。

修改

我试图找到一种方法来表示一组太大而无法容纳在内存中的随机(外观)数字(可能是3e12数字),然后测试某些数字范围是否显示在该组中。

例如,

。如果我有一个函数给我随机集(4,22,7,343,67,38,2),我想能够说,给我从该集合中的数字在1到30之间,并且得到集合(4,22,7,2)。

2 个答案:

答案 0 :(得分:1)

正如RB所说,你需要加密,而不是RNG。使用给定密钥,加密是可逆的。如果您希望来自具有更改范围的相同种子的不同结果,则密钥可以包含种子和范围。

范围大小是一个不同的问题。对于32位范围,使用DES。对于64位使用AES。对于其他范围,请编写您自己的简单Feistel cypher或使用为所有尺寸定义的Hasty Pudding cypher

无论你使用什么底层密码,你总是可以使用Hasty Pudding方法在适当的范围内找到一个数字:只需保持输出的encyphering直到它在所需的范围内。一旦你有适当大小的东西,你可以添加下限以获得所需的数字。因此,对于5到35的范围,您将在[0..30]中生成一个数字并添加5。

ETA:在考虑了你的问题之后,你不能将种子用作密钥的一部分。如果这样做,您将无法重建密钥来解密您的随机数。您只能使用当开始撤消流程时您将知道的密钥中的数据。

当你来到它时,你还需要一种识别种子的方法。当你解密时,你将获得一系列数字;你需要一种方法来挑出哪一个是原始种子。也许您可以将种子限制在指定的范围内(或其从零开始的等效范围),并选择解密序列中第一个落在正确范围内的种子。

答案 1 :(得分: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

此时,显然不可能编写一个Decode算法,如果输入为20,则可以返回正确的种子 - 您无法确定56是否为正确的答案。

听起来加密算法可以更好地满足您的需求 - 我甚至不理解为什么涉及随机数生成器。