【发布时间】:2016-10-22 23:26:12
【问题描述】:
我需要为加密目的生成一个 12 字节的随机数据。我的第一个想法是使用类似的东西
random(maxint) * random(maxint) * random(maxint)
但我发现这在多线程上效率不高,因为随机使用全局变量 RandSeed(实际上随机不是多线程)。随机看起来也很容易猜到:
function Random(const ARange: Integer): Integer;
var
Temp: Integer;
begin
Temp := RandSeed * $08088405 + 1;
RandSeed := Temp;
Result := (UInt64(Cardinal(ARange)) * UInt64(Cardinal(Temp))) shr 32;
end;
因此,如果您知道其中一个生成的随机数,您就可以轻松猜出下一个生成的随机数...
他们是否可以替代 random 来生成我的 12 字节随机字节?
【问题讨论】:
-
下一个随机数是什么重要吗?顺便说一句,三个 32 位数字不适合一个 64 位数字。 maxint*maxint ≈ maxint64
-
是的,因为如果一个人知道一个随机生成的数字,他可以猜出下一个生成的所有不好的数字。不是适合 64 位,而是适合 96 位(12 字节)
-
不好,为什么?例如,当您添加盐进行散列时,谁在乎盐来自哪里或下一个将是什么,只要您将其应用于特定的散列,并且有很多不同的盐。我很好奇在什么情况下不知道下一个数字很重要。
-
使用随机数作为密钥时。你给别人一把钥匙,所以这个人可以猜到你将给别人的下一把钥匙。我需要一个随机数的随机数
-
Cryptographically secure random numbers 与日常随机数有很大不同。如果您正在尝试编写密码库,请忘记它 - 如果您被困在这里,那么您就没有希望构建任何有用的东西。但是,如果您需要使用密码学,那么只需使用库即可。这就是它们存在的原因——因为试图在痛苦中终结自己。
标签: delphi