出于加密目的使用Java SecureRandom洗牌?

出于加密目的使用Java SecureRandom洗牌?,java,random,cryptography,shuffle,Java,Random,Cryptography,Shuffle,我有一个整数列表,顺序是必不可少的。列表可以非常大,最多2^24个元素。我想“加密”它,使原始值及其频率保持不变;从本质上讲,就是对列表进行洗牌。我发现一种非常简单(但非常不安全!)的方法是使用PRNG,如Java.Random。该过程将是使用发送方和接收方共享的密钥播种PRNG,然后应用任何随机排序算法(例如Fisher-Yates)。这样,知道密钥的接收者将能够“恢复”洗牌 我知道这是一个非常糟糕的主意,但使用SecureRandom真的会变得更好吗?我知道它的用途适用于加密,但我不认为它是

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

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

(总的来说,我知道“从不做你自己的算法”是crypto 101,但到目前为止,我还没有发现任何其他算法具有我想要的特性,即只是“重新排序”,但将值和频率保留在原始列表中。如果存在这样的情况,你能给我指一下吗?)


谢谢!:)

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


实现一个函数
intrandom(intcount)
,该函数从流中读取8个字节,获取整数模计数,并将其用作Fisher-Yates混洗中的构建块。这并不是完全一致的,但在实践中已经足够接近于无关紧要了。如果是偏执狂,请将其最大值从8字节改为16字节。

您试图解决的真正问题是什么。它不能像保持发送者和接收者之间的通信安全那样简单,因为要做到这一点,您只需对整个流进行加密。那么你真正想达到的目的是什么呢?本质上,用可逆的方式“模糊”照片的某些部分。这有帮助吗?你为什么不简单地加密照片中你想混淆的部分呢?哦,等等,你想让它们保持“有效”照片?没错!否则它会对图片产生很大的影响,这正是我试图避免的。我建议你关闭这个关于StackOverflow的问题,并在上重新发布。对于这样的开放式设计问题,这将是一个更好的论坛。StackOverflow针对特定的编程问题(通常伴随代码),这些问题有一个特定的、客观的答案。谢谢!我没有想过用这种方式使用流加密(我只是从加密开始),它似乎很有前途!我会调查的,接受这个答案!