我用一个广义Feistel网络生成排列,它将输出指定范围内的整数值$r_j$,根据计数器输入随机地输出整数值,然后在每一个都精确到达一次之后循环。
我不是将计数器分成两个大小相等的位向量$L$和$R$,而是在商和余数上操作,其目的是生成任意长度的排列,而不是平衡网络或最大LSFR可能生成的$2^n$。
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;
uint16_t F = (i * r + q);
r = F % d;
q = nr;
}
return q*d + r;
}此代码可以正确地生成一些最大排列。但是,它只对平方值的周期(其中s = 0)这样做。
这是否可以改变,使任何选择的周期产生一个完整的排列?此外,在不平衡的Feistal网络(除数*商+余数,两个素数之和,左位和右位向量等)中,是否有更广泛的数值问题来选择如何拆分和操作一个数?
发布于 2018-06-24 22:16:36
我认为你的这种方法是行不通的。原因在于计算$r = counter$ mod $s$的方式。以$(counter_1,周期)= (3,11)$和$(counter_2,周期)= (5,11)$为例。这里是$d=3$和$s=5$。获得初始$(q_1,r_1) = (1,3)$和$(q_2,r_2) = (1,0)$。在循环的第一次迭代之后,您有$(q_1,r_1) = (3,1)$和$(q_2,r_2) = (0,1)$。在循环的第二次交互之后,您将得到$(q_1,r_1) = (1,1)$和$(q_2,r_2) = (1,1)$。现在,对于其余的迭代,$(q_1,r_1)$和$(q_2,r_2)$都将始终保持为相等的,最终将导致函数返回两个不同计数器值的等数值,并且在相同的时间内破坏最大置换。您应该通过将初始$r$计算为$r = counter$ mod $d$来解决上述问题。
https://crypto.stackexchange.com/questions/60244
复制相似问题