我有一个整数列表,其顺序至关重要。该列表可以非常大,最多 2^24 个元素。我想以原始值及其频率保持不变的方式“加密”它;本质上,就是对列表进行洗牌。我发现一个非常简单(但非常不安全!)的方法是使用 PRNG,如 Java.Random。该过程将使用发送者和接收者共享的 key 播种 PRNG,然后应用任何随机排序算法(例如 Fisher-Yates)。这样,知道 key 的接收者就能够“恢复”洗牌。
我知道这是一个极其糟糕的想法,但是使用 SecureRandom 真的会变得更好吗?我知道它的用途适合加密内容,但我不认为它意味着用于输出大量数字列表。
(总的来说,我知道“永远不要做你自己的算法”是加密货币101,但到目前为止我还没有找到任何其他算法具有我想要的属性,即“重新排序”但将值和频率保留在原始列表。如果存在这样的东西,您能指点一下吗?)
谢谢! :)
最佳答案
你的想法很好,你只需要使用安全的伪随机流。创建此密码的最简单方法是流密码,例如 CTR 模式下的 AES。
实现一个函数 int Random(int count)
,从流中读取 8 个字节,采用该整数模计数,并将其用作 Fisher-Yates shuffle 中的构建 block 。这并不完全一致,但足够接近,在实践中并不重要。如果偏执,请将其增加到 16 个字节,而不是 8 个字节。
关于java - 使用 Java SecureRandom 进行洗牌以实现加密目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385833/