假设我有一个32位整数。最初我用随机/秘密的东西种下这个黑匣子。
每次我打电话,提前,我都会得到序列中的下一个数字,但序列中的下一个数字不一定是下一个最大数字,就像++
一样,这是不可预测的。我已经使用排列表完成了这个但是需要很大的空间而且我想知道是否有人知道某个特定的构造会给出一个基于某个种子值的某个确定性顺序的整个范围然后只产生每个值每个周期一次。
有谁知道这样的计划?
答案 0 :(得分:0)
Thomas Pornin关于crypto.stackexchange.com的问题有一个有趣的答案,就如何设计一个安全的alternating step generator(ASG)。
这不是我问题的最快解决方案,但我认为会这样做。
我写了这段代码来测试我的理论
struct Lfsr
{
public readonly int State;
public Lfsr(int seed)
{
this.State = seed;
}
public Lfsr Advance()
{
var bit = ((State >> 30) ^ (State >> 27)) & 1; // ^ (State >> 1) ^ (State >> 0)
return new Lfsr(((State << 1) | bit) & 0x7fffffff);
}
}
static void Main(string[] args)
{
var n = 0;
var lfsr = new Lfsr(1);
do
{
lfsr = lfsr.Advance();
++n;
}
while (lfsr.State != 1);
Console.WriteLine(n);
}
在我的机器上花了大约7秒的时间来循环,计算出一段2147483647个数字。为了确保安全,您必须将它们组合成ASG并使用三倍大的线性反馈移位寄存器(LFSR)。
您还需要使用最大长度反馈多项式来获得强度。维基百科文章引用了一个PDF,它列出了长度最大为168位的最大长度反馈多项式。