java - 使用 Java SecureRandom 进行洗牌以实现加密目的?

标签 java random cryptography shuffle

我有一个整数列表,其顺序至关重要。该列表可以非常大,最多 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/

相关文章:

c++ - 英特尔® TinyCrypt : how to use AES-128/CTR

java - 在Java中,设计线性算法来查找具有最高总和的连续子序列

jquery - 为二维区域中不同大小的非重叠四边形生成随机位置

c - 我如何使用带有 c 字符串输入的 switch ?

javascript - 使用 jQuery 在随机位置附加内容?

java - 各种类型文件的哈希值

java - 为什么此 URL 从 Tomcat 返回错误 400?

java - 使用java 8 sdk播放声音

Java NIO 从输入流读取大文件

java - 使用 Keystore 存储 key