0

我有一个整数列表,其中顺序是必不可少的。该列表可以非常大,最多 2^24 个元素。我想以原始值及其频率保持不变的方式对其进行“加密”;本质上,就是对列表进行洗牌。我发现一种非常简单(但非常不安全!)的方法是使用 PRNG,如 Java.Random。该过程将使用发送方和接收方共享的密钥为 PRNG 播种,然后应用任何随机排序算法(例如 Fisher-Yates)。这样,知道密钥的接收器将能够“恢复”洗牌。

我知道这是一个非常糟糕的主意,但使用 SecureRandom 真的会变得更好吗?我知道它的用途适用于加密货币,但我不认为它是用来输出大量数字的。

(总的来说,我知道“从不做你自己的算法”是加密 101,但到目前为止,我还没有找到任何其他具有我想要的属性的算法,即“重新排序”但将值和频率保留在原始列表中。如果存在这样的事情,请您指出来吗?)

谢谢!:)

4

1 回答 1

1

你的想法很好,你只需要使用一个安全的伪随机流。创建它的最简单方法是流密码,例如 CTR 模式下的 AES。

实现一个int Random(int count)从流中读取 8 个字节的函数,采用该整数模数,并将其用作 Fisher-Yates shuffle 中的构建块。这不是完全一致的,但足够接近,在实践中并不重要。如果是偏执狂,将其增加到 16 个字节而不是 8 个字节。

于 2013-01-18T21:40:36.983 回答