我正在生成一个
generalized Feistel network
而不是把计数器分成两个大小相等的位向量
L
R
,我对商和余数进行运算,它通过返回商*除数+余数重新组合。这允许任何周期的排列(不只是2的幂,
like an LSFR
):
uint16_t feistel(uint16_t counter, unsigned period)
{
uint16_t d = sqrt(period);
uint16_t s = period - d*d;
uint16_t q = counter / d;
uint16_t r = counter % s;
for (int i = 0; i < 3; i++)
{
uint16_t nr = r;
/* a simple insecure round function */
uint16_t F = (i * r + q);
r = F % d;
q = nr;
}
return q*d + r;
}
可以
正确生成一些最大置换(即
[feistel(N)...feistel(N+period)]
包含介于
[0, period]
但是,它只对平方数的周期执行此操作(其中
s
这可以改变,使任何周期的选择产生一个完整的排列吗?