试图写一个8位可逆PRNG,而不是密码

我试图建立一个PRNG字节,我可以取一组字节(比如说10或15个字节)并返回一个种子列表来产生这个字节列表。 我不关心密码学,但它必须大致均匀分布,它必须达到所有可能的2 ^ 8组合,并且它必须偶尔能够重复数字而不会卡住。

问题是,我读过的大多数算法都使用密码,这可能意味着它不允许重复,或者他们使用模数或非循环移位来诱导丢失,并且使得函数在最佳情况下不切实际。 另外,如果算法使用计数,那么将很难反向工作,因为字节列表输入不知道内部PRNG的计数器在生成时是什么。

我意识到我正在寻找的是一个有你的蛋糕和吃它的情况,但我想确保没有另一个我错过的解决方案。

在搜索时,我遇到了这个有相似要求的帖子。 我用C#编写,但实际上,语法并不重要。

我试图自己编写的每种算法都是密码,因此无法在分发中重复和/或不统一。 我使用了反转,循环移位和种子遮蔽。


这是否工作?

#include <stdio.h>

int seed = 1;

int next() {
    seed = 1664525*seed + 1013904223;
    return (seed & 0xff) ^ (seed>>8 & 0xff) ^ (seed>>16 & 0xff) ^ (seed>>24 & 0xff);
}   

int main() {
    int i;
    for(i = 0; i < 1000; i++) {
        printf("%dn", next());
    }   
}  

由于它基于一个具有整个周期的线性同余发生器(LCG),因此最终每个种子都会生成每个字节。 似乎有重复。 它继承了基础LCG的一致性。


我的顾问已经修改了PRNG(基于L'Ecuyer的clcg4),这是可逆的,以支持我们集团的HPC模拟工作。 你可以在这里阅读这些。

基本上,它“解除了”已经完成的任务,并且正如您可能已经猜到的那样,这可能需要“撤销”随机数生成,然后再沿不同的计算路径重新生成这些相同的值。 你可以看看这里和这里的代码。 它是BSD授权代码。

链接地址: http://www.djcxy.com/p/37265.html

上一篇: Trying to write an invertible PRNG of 8 bits, not a cipher

下一篇: Looking for PRNG that you can seed with any number bytes