我正处于创建黑桃游戏的粗糙阶段,我很难想出一种以加密方式安全的方式来洗牌。到目前为止,我有这个:
基本上从这里我都保存每个Random实例的32位结果并使用它来播种下一个实例,直到我得到我想要的熵量。从这里开始,我创建了一个交替步骤生成器来生成最终的48位种子值,用于我的最后一个随机实例来洗牌。
我的问题与交替步骤生成器之前的部分有关,但如果没有,因为我将使用CSPRNG,这个算法是否足够好?
或者,最终的Random实例是绝对必要的吗?我可以一次性从ASG上取六位并取值mod 52吗?
答案 0 :(得分:3)
不,它可能对您的目的而言足够安全,但它肯定不是加密安全的。在快速系统上,您可能有两个相同的系统时间。最重要的是,乘法只会去除熵。
如果您不想,可以下载RNG的FIPS测试并使用您的RNG输入大量数据,然后进行测试。请注意,即使我在阅读有关RNG测试的文档时也遇到了麻烦,所以请准备好进行一些数学计算。
所有这一切虽然Java平台已经包含一个安全的PRNG(它基于SHA1并使用操作系统的RNG作为种子)。操作系统几乎肯定会使用一些基于时间的信息作为种子,不需要自己输入(当然,如果你真的想要,你可能总是会花费系统时间)。
答案 1 :(得分:1)
有时简单的答案是最好的答案:
List<Card> deck; // Get this from whereever.
SecureRandom rnd = new SecureRandom();
java.util.Collections.shuffle(deck, rnd);
// deck is now securely shuffled!
答案 2 :(得分:0)
你需要一个良好的改组算法和一种收集足够熵的方法来提供它,这样它理论上可以覆盖一副牌的所有可能的排列。请参阅此前一个问题:Commercial-grade randomization for Poker game