生成安全的随机双精度而不会溢出

时间:2017-07-18 17:16:14

标签: java random cryptography double range

我想在非常大的范围内生成一个随机的,加密安全的双精度数,比如-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)。虽然这种方法确实能够跨越我需要的范围,但这种实现并不是加密安全的!

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

1 个答案:

答案 0 :(得分:1)

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

如果在-10 308 到+10 308 的范围内选择2 64 ,则两个相邻的数字将由相当大的距离为2.0E + 308/2 ** 64,约为1.08E + 289。

由于双精度数具有53位有效数,因此无论如何这些数中的大多数都是无法区分的。例如,在使用双精度算术时,将1.08E + 289添加到1.0E + 307绝对没有效果。

即使您设法找到将2 64 值映射到此范围内的方法,您仍可能仍然容易受到birthday attacks的攻击。通常,您需要至少80位才能提供有用的保护级别。