Random 每轮xorshift RNG后使用另一个值的XOR?

Random 每轮xorshift RNG后使用另一个值的XOR?,random,cryptography,arduino,prng,Random,Cryptography,Arduino,Prng,Xorshift和所有LFSR类型的发电机都会嘎吱嘎吱地停止工作,如果一个人用全零状态给它播种,它什么也不做。看起来(如果我的测试中没有bug),以下函数: y = one_xorshift_round(y) y = y ^ key 会抵抗这种锁定,因为y的任何非零状态都会产生对某个随机值的更改,并且任何为零的状态都会通过键与其他状态异或。如果钥匙使它落在零上,它将在下一轮修正它 我想你也会从每一个“关键”值产生不同的序列中得到额外的好处 我的应用程序是一个Arduino库,它需要统计上的随机

Xorshift和所有LFSR类型的发电机都会嘎吱嘎吱地停止工作,如果一个人用全零状态给它播种,它什么也不做。看起来(如果我的测试中没有bug),以下函数:

y = one_xorshift_round(y)
y = y ^ key
会抵抗这种锁定,因为y的任何非零状态都会产生对某个随机值的更改,并且任何为零的状态都会通过键与其他状态异或。如果钥匙使它落在零上,它将在下一轮修正它

我想你也会从每一个“关键”值产生不同的序列中得到额外的好处

我的应用程序是一个Arduino库,它需要统计上的随机数,这些随机数不需要任何加密强度,但不能一次又一次地重复相同的周期。我想做的是,使用电路板通电后的当前微秒计数作为键,每次使用时,它都会给RNG增加一点熵(由于用户输入等导致事情的确切时间不确定),并且还会导致随机序列随时间而不同,或者说是人为地假装有一个更大的周期

我的问题是,是否存在某个key值,或者变量key的简单模式,会导致XORSHIFT生成器做一些不好的事情,比如输入一个短周期?我想实际计算出来的数学是非常复杂的,但也许有人引用了一篇论文或类似修改过的RNG

谢谢


编辑,附加信息:我对“全零状态”问题的第一反应是每轮向状态添加1,但我发现,向状态中添加一个常数会减少周期,减少的量随常数的变化而变化,但似乎没有任何简单的模式。

键会导致短周期的最简单情况是,键是原始生成器中的异或一个值及其后续值。这将产生将状态重置为其先前值的效果,因此它只能产生一个输出

如果原始生成器的许多不同输出对的关键值相同,那么这将表示随机性测试中的严重失败,因此更有可能存在许多不同的值,这些值将在该周期的不同点有效地将周期中的一个阶段后退

因此,可以公平地假设,密钥的多个值可以缩短生成器的周期,最终将其捕获到单个值轨道中。还有一些更复杂的情况导致轨道更长,这还不是完整的周期,但这些情况更难思考

您可能想做的是单独收集熵,并使用它来调节PRNG的输出,而不会破坏PRNG本身的质量。例如

void add_entropy(uint32_t more)
{
    entropy = one_xorshift_round(entropy + more);
}

uint32_t rand(void)
{
    y = one_xorshift_round(y);
    return one_xorshift_round(y + entropy);
}

我不会过分摆弄随机生成器(比如任意改变状态空间),因为它良好的统计特性可能会消失

测试种子不全是零一点也不坏:这是在每一个这类生成器中所做的。如果你想注入熵,只需对状态空间中的熵位进行异或运算,如果你得到了全零,只需输入一些常数。如果状态空间足够大,那么概率就很低,以至于你输入的内容是不相关的。在这种情况下,许多已发布的生成器使用生成器的名称(作为ASCII值的序列)为生成器设置种子!:)


但是,我建议您尝试一些64位的变体,比如xorshift*/xorshift+,因为它们比纯xorshift生成器具有更好的统计特性。您可以在

上找到最新的报告,为什么不将状态初始化为非零,并使用最大长度LFSR,而不是尝试发明自己的报告?主要是因为我希望能够定期将新的熵异或到状态中,以随时间提高质量,而测试全零状态似乎很难看,而且理论上也可以改变“键”,得到完全不同的序列。但是,如果没有人听说过任何论文或任何东西,我可能会听从你的建议,即使播种延迟了启动一点。Xorshift生成器也存在于更大的变体中,例如在最初的论文中有一个版本(
xor128()
),其中状态由四个uint32(不全是零,周期2^128)组成;在我的计算机上,12个额外字节不是问题,它的速度和简单的xorshift一样快——在Arduino上不知道:)@EternityForest最大长度LFSR生成一个序列,该序列生成所有可能的输出数。任何引入“弱键”的修改都会缩短最大长度。如果你想引入更多的熵,你可能不应该使用像LFSR一样弱且可预测的PRNG。是的,两个成功状态的XOR作为一个键完全按照你说的那样。我认为“弱键”相当罕见,但显然确实存在。你从来没有想过,通过对一对不同的连续状态进行异或运算而发现的每一个新值都是一个新的弱键。如果随机数生成器很好,那么你会发现很多弱键;因为如果RNG连续输出的异或被限制在一个小的值集内,那么RNG就太可预测了。好吧,xor移位不是加密的,我也没有发现太多的弱密钥,所以要么我的代码中有一个bug。。。或者xorshift没有你想象的那么多s(n)^s(n-1)的可能性。我确实发现,使用每个周期递增的值进行XORing(这不应该导致相同的短期效应)可以提高Diehard分数,但代价是使整个事情变得不标准,这似乎是非安全相关内容可以接受的权衡。我想我会用一个固定的想法抛弃XOR,但在美国,随着时间的XOR似乎没问题,除非有理由不这么做。