代码之家  ›  专栏  ›  技术社区  ›  zetavolt

非平衡Feistel网络只产生平方长度的完全置换

  •  0
  • zetavolt  · 技术社区  · 7 年前

    我正在生成一个 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

    这可以改变,使任何周期的选择产生一个完整的排列吗?

    0 回复  |  直到 7 年前