java - 生成无溢出的安全随机 double

标签 java random cryptography double range

我想在一个很大的范围内生成一个随机的、加密安全的 double 值,比如 -Double.MAX_VALUEDouble.MAX_VALUE

根据现有的 StackOverflow 问题 ( 1 2 3 4 5 6 ),您可能会认为使用 min + new SecureRandom().nextDouble() * range 就足够了,但是 Double.MAX_VALUE - -Double.MAX_VALUE 溢出并变得无限!

为了解决这个问题,this StackOverflow answer建议使用 ThreadLocalRandom.nextDouble(min, max) 。虽然此方法确实能够跨越我需要的范围,但此实现在加密上并不安全!

如何安全地生成这么大范围内的随机数?

最佳答案

我认为这是不可能的。密码安全性的要求之一是这些数字应该与随机统一选择的值无法区分。

如果您选择 -10308 到 +10308 范围内的 264 个数字,则两个相邻的数字将用相当大的距离2.0E+308/2**64,大约是1.08E+289。

由于 double 有 53 位有效数,因此大多数数字无论如何都无法区分。例如,在使用 double 算术时,将 1.08E+289 添加到 1.0E+307 绝对没有效果。

即使您确实找到了一种将 264 值映射到此范围的方法,您可能仍然容易受到 birthday attacks 的影响。 。一般来说,您至少需要 80 位才能提供有用的保护级别。

关于java - 生成无溢出的安全随机 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45173256/

相关文章:

java - Base64 编码字符串不匹配

c++ - 实现二进制搜索猜谜游戏

java - 将 java.sql.Timestamp 转换为 java.util.Calendar 而不会丢失精度

java - 在计算哈希码时,HashSet 如何在没有 NullPointerException 的情况下记录空条目

java - 通过 Java 中的用户输入实现更多的随机性

Python 和密码学 : md5

php - 为什么我不能在 PHP OpenSSL 中为 EC 使用小于 384 位的 key 长度?

php - 比 md5 更短的 php 密码?

java - 如何从 Intellij IDEA 中的 "new"上下文菜单中删除文件类型子菜单

java - java中随机数组与随机数组相加,使其等于另一个数组