【发布时间】:2014-03-06 04:26:35
【问题描述】:
Xorshift 和所有 LFSR 类型的生成器如果将其设为全零状态,则会停止运行并且什么也不做。看起来(如果我的测试中没有错误),以下功能:
y = one_xorshift_round(y)
y = y ^ key
将抵抗这种锁定,因为 y 的任何非零状态都会对某个随机值产生变化,并且任何为零的状态都将通过密钥与其他值进行异或。如果密钥导致它落在零上,它会在下一轮修复它。
我想您还会获得每个“键”值产生不同序列的额外好处。
我的应用程序是一个 Arduino 库,它需要统计上的随机数,这些随机数根本不需要任何加密强度,但不能一遍又一遍地重复相同的循环。我想要做的是使用板子上电以来的当前微秒计数作为密钥,这应该在每次使用 RNG 时增加一点熵(由于用户造成的事情的确切时间不确定性输入等),并且还会导致随机序列随着时间的推移而不同,有点人为地伪造具有更大的周期。
我的问题是,是否有一些键值或变量键的简单模式会导致 XORSHIFT 生成器做一些坏事,比如进入一个短周期?我想实际计算出来的数学会非常复杂,但也许有人参考了一篇论文或类似修改过的 RNG 的东西?
谢谢!
编辑,附加信息:我对全零状态问题的第一反应是每轮都向状态添加 1,但我发现向状态添加一个常数会减少周期的数量,该数量随不变,但似乎没有任何简单的模式。
【问题讨论】:
-
为什么不将状态初始化为非零值,并使用最大长度的 LFSR,而不是尝试自己发明?
-
主要是因为我希望能够定期将新熵异或到状态中,以随着时间的推移提高质量,并且对全零状态的测试看起来很丑陋,而且还因为能够改变的理论上的好处“关键”并得到一个完全不同的序列。但如果没有人听说过任何论文或任何东西,我可能会听从你的建议,即使播种会延迟启动。
-
Xorshift 生成器也存在于更大的变体中,例如在原始论文中有一个版本 (
xor128()),其中状态由四个 uint32(并非全为零,周期 2^128)组成;在我的电脑上 12 个额外的字节不是问题,它和简单的 xorshift 一样快——在 Arduino 上不知道 :) -
@EternityForest 最大长度 LFSR 生成单个序列,该序列生成每个可能的输出数。任何引入“弱键”的修改都会缩短最大长度。如果您担心引入更多熵,您可能不应该使用像 LFSR 那样弱且可预测的 PRNG。
标签: random cryptography arduino prng