该算法会生成加密安全的比特流吗?

时间:2011-05-23 05:45:05

标签: java cryptography

我正处于创建黑桃游戏的粗糙阶段,我很难想出一种以加密方式安全的方式来洗牌。到目前为止,我有这个:

  • 在调用Random
  • 之前获取32位系统时间
  • 从Random
  • 获取32位
  • 调用Random
  • 后获取32位系统时间
  • 将系统时间按位相乘,将x或两半相加
  • xor来自Random的32位和第一个xor的值,并将其称为种子
  • 使用种子
  • 创建一个新的随机数

基本上从这里我都保存每个Random实例的32位结果并使用它来播种下一个实例,直到我得到我想要的熵量。从这里开始,我创建了一个交替步骤生成器来生成最终的48位种子值,用于我的最后一个随机实例来洗牌。

我的问题与交替步骤生成器之前的部分有关,但如果没有,因为我将使用CSPRNG,这个算法是否足够好?

或者,最终的Random实例是绝对必要的吗?我可以一次性从ASG上取六位并取值mod 52吗?

3 个答案:

答案 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