在 Briceno 等人的 A5/2 实现中,他们在没有 运行 时钟周期功能的情况下延迟 LSFR 周期。有人可以帮我理解吗?

In Briceno et al.'s A5/2 implementation, they delay a LSFR cycle without running a clock cycle function. Can someone help me understand?

这是一段代码,摘自 Marc Briceno、Ian Goldberg 和 David Wagner 的开创性“GSM A5/1 和 A5/2“语音隐私”加密算法的教学实施” :

typedef unsigned char byte;
typedef unsigned long word;
typedef word bit;
...
word R1, R2, R3;
#ifdef A5_2
word R4;
#endif /* A5_2 */
...
/* Generate an output bit from the current state.
 * You grab a bit from each register via the output generation taps;
 * then you XOR the resulting three bits.  For A5/2, in addition to
 * the top bit of each of R1,R2,R3, also XOR in a majority function
 * of three particular bits of the register (one of them complemented)
 * to make it non-linear.  Also, for A5/2, delay the output by one
 * clock cycle for some reason. */
bit getbit() {
        bit topbits = (((R1 >> 18) ^ (R2 >> 21) ^ (R3 >> 22)) & 0x01);
#ifndef A5_2
        return topbits;
#else /* A5_2 */
        static bit delaybit = 0;
        bit nowbit = delaybit;
        delaybit = (
            topbits
            ^ majority(R1&0x8000, (~R1)&0x4000, R1&0x1000)
            ^ majority((~R2)&0x10000, R2&0x2000, R2&0x200)
            ^ majority(R3&0x40000, R3&0x10000, (~R3)&0x2000)
            );
        return nowbit;
#endif /* A5_2 */
}

几天来我一直在研究这个实现,我了解数据的去向和来源(以及它在算法中的用途)方面的情况。

我唯一不明白的是 /*Also, for A5/2, delay the output by one clock cycle for some reason. */

我不明白

static bit delaybit = 0;
bit nowbit = delaybit;
delaybit = (...);
return nowbit;

给出“延迟”输出。

即。 delaybit 怎么会延迟呢?如果我们返回 nowbit 为什么我们要生成 delaybit 在代码的其他地方,延迟的概念是有意义的,因为寄存器 (R1R2R3) 有专门的时钟功能。 我没有将 nowbitdelayedbit 的目的视为此函数中的两个独立实体。

难道我们只需要一个变量吗?通过在延迟一个时钟周期内混合它,我们将执行延迟。

我的理解有问题吗?或者也许用代码?这是一个广泛传播的文件,所以我希望找到 public 代码问题的记录(如果有的话)。

“绝招”在这里:

static bit delaybit = 0;

静态变量在调用之间保持其值。第一次将其设置为 0,并返回该值。然后计算 next 值,由将来的调用返回。

我觉得有点太可爱了。