如何解决该算法会生成加密安全的比特流吗?
| 我正处于创建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!
,您需要一个良好的改组算法,以及一种收集足够熵以馈送它的方法,以便从理论上讲它可以覆盖一副纸牌的所有可能排列。看到这个先前的问题:扑克游戏的商业级随机化
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。