【发布时间】:2011-05-23 05:45:05
【问题描述】:
我正处于创建黑桃游戏的艰难阶段,我很难想出一种加密安全的洗牌方式。到目前为止,我有这个:
- 在调用 Random 之前获取 32 位系统时间
- 从 Random 中获取 32 位
- 调用 Random 后获取 32 位系统时间
- 将系统时间按位相乘并将两半相异或
- 将 Random 中的 32 位与第一个 xor 中的值进行异或,并将其称为种子
- 使用种子创建一个新的随机数
基本上从这里我都保存了每个 Random 实例的 32 位结果,并用它来为下一个实例播种,直到我得到我想要的熵量。从这里我创建了一个交替步骤生成器来生成最终的 48 位种子值,用于我的最终 Random 实例来洗牌。
我的问题与交替步生成器之前的部分有关,但如果不是,因为无论如何我都会使用 CSPRNG,这个算法是否足够好?
或者,最终的 Random 实例是绝对必要的吗?我可以一次从 ASG 上抓取 6 位并取 mod 52 的值吗?
【问题讨论】:
-
不是答案,但如果您需要 Java 中的加密安全 PRNG,请使用 SecureRandom。它很容易获得,很少需要任何配置——我知道的大多数 JRE 都提供了开箱即用的 SHA1PRNG 算法。
-
从加密 PRNG 中获取尽可能多的内容。不需要做这么复杂的事情。
-
按位乘法是什么意思?按位与?
-
这个问题听起来更像是收集熵而不是洗牌。为什么不直接使用 /dev/urandom 作为加密安全 PRNG 的输入?
标签: java cryptography