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

问题描述

| 我正处于创建Spades游戏的艰难阶段,并且很难思考采用加密安全的方式洗牌的方法。到目前为止,我有这个: 在调用Random之前抢占32位系统时间 从随机获取32位 调用Random后抢占32位系统时间 将系统时间按位相乘,然后将两个半部分相加或 将Random中的32位与第一个xor中的值进行异或,并将其称为种子 使用种子创建一个新的随机数 从这里基本上,我都保存了每个Random实例的32位结果,并用它来播种下一个实例,直到获得所需的熵。在这里,我创建一个交替生成器,以生成最终的48位种子值,该值将用于最终的Random实例以洗牌。 我的问题与交替步骤生成器之前的部分有关,但是如果不是,因为无论如何我将使用CSPRNG,此算法是否足够好? 另外,最终的Random实例是否绝对必要?我可以一次从ASG上抢六位并取值mod 52来逃脱吗?     

解决方法

不,它可能足够安全以达到您的目的,但是肯定不是加密安全的。在快速系统上,您可能有两个相同的系统时间。最重要的是,相乘只会消除熵。 如果不需要,可以下载RNG的FIPS测试,并使用RNG输入大量数据,然后进行测试。请注意,即使我实际上也无法阅读有关RNG测试的文档,也请做好一些数学准备。 所有这些,而Java平台已经包含一个安全的PRNG(基于SHA1,并使用操作系统的RNG作为种子)。几乎可以肯定,操作系统使用一些基于时间的信息作为种子,而无需您自己输入(当然,如果您确实愿意,可以始终为系统时间添加种子)。     ,有时候,简单的答案是最好的答案:
List<Card> deck; // Get this from whereever.
SecureRandom rnd = new SecureRandom();
java.util.Collections.shuffle(deck,rnd);
// deck is now securely shuffled!
    ,您需要一个良好的改组算法,以及一种收集足够熵以馈送它的方法,以便从理论上讲它可以覆盖一副纸牌的所有可能排列。看到这个先前的问题:扑克游戏的商业级随机化