encryption - 数字、可逆、伪随机数生成器,适用于非常大的数字

标签 encryption random

有人知道符合上述所有条件的算法吗?我需要指定一个种子编号,以及我希望输出数字落入的范围(这也是输入数字所在的范围)。这个函数还需要有一个反向操作的对应物。

例如:

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

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

我能想到的唯一符合此描述的是加密算法。即使指向正确的方向也会很棒。

编辑

我试图找到一种方法来表示一组太大而无法保存在内存中的随机(看起来)数字(可能是 3e12 个数字),然后测试该组中是否出现了特定范围的数字。

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

最佳答案

正如 RB 所说,您需要加密,而不是 RNG。使用给定的 key ,加密是可逆的。如果您希望从具有更改范围的同一种子获得不同的结果,则键也可以包含种子和范围。

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

无论您使用什么底层密码,您始终可以使用 Hasty Pudding 方法在适当的范围内找到一个数字:只需继续加密输出,直到它在所需的范围内。一旦你有了合适的尺寸,你就可以重新添加下限以获得所需的数量。因此,对于 5 到 35 的范围,您将在 [0..30] 中生成一个数字并加 5。

预计到达时间:仔细考虑您的问题后,您不能将种子用作 key 的一部分。如果这样做,您将无法重建 key 来解密您的随机数。您只能使用在您开始逆向过程时知道的 key 中的数据。

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

关于encryption - 数字、可逆、伪随机数生成器,适用于非常大的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413686/

相关文章:

javascript - AES 解密返回空字符串

c# - ASP.NET Core 中的 MD5CryptoServiceProvider

mysql - mysql有非对称加密功能吗?

c# - 在 winrt c# 中加密字符串并在 c# .net 中解密

haskell - 随机列表,其中每个元素与前一个元素最多相差 1

php - PHP 5.5 的 Ioncube 难度

c++ - C++ 中的线性同余生成器、运算符 & 和 >>

r - 从具有间隙的均匀分布中抽取随机样本

javascript - 具有不同帧速率的函数中的随机数

java - 如何在数学表中打印随机数?