线性反馈移位寄存器解释

Linear Feedback Shift Register explaination

我想使用线性反馈移位寄存器混淆字符串,所以我试图理解下面的 wiki 代码 在下面线性反馈移位寄存器的维基示例中,'0xACE1u' 是用作起始状态的十六进制值,但我不明白这是什么 0xB400u ?

有人可以解释一下那是什么吗?以及任何解释如何使用 LFSR 混淆字符串的 link 将不胜感激

int main(void)
{
    uint16_t start_state = 0xACE1u;  /* Any nonzero start state will work. */
    uint16_t lfsr = start_state;
    unsigned period = 0;

    do
    {
        unsigned lsb = lfsr & 1;   /* Get LSB (i.e., the output bit). */
        lfsr >>= 1;                /* Shift register */
        if (lsb) {                 /* If the output bit is 1, apply toggle mask. */
            lfsr ^= 0xB400u;
        }
        ++period;
    } while (lfsr != start_state);

    return 0;
}

The Wikipedia article you got this from 有一个插图解释了代码的作用:

从移位寄存器末尾提取的最低有效位通过与位16、14、13和11进行异或反馈。当该位为零时,这不起作用,但是当它为1,所有这些位都被翻转。最快的方法是计算 16 位移位寄存器与 0xB400 的异或积,其中设置了所有这些位(二进制为 1011010000000000)。

(注意:没有异或门馈入第 16 位,因为没有来自第 17 位的输入。)

其他 LFSR:

This page 包含适用于不同长度 LFSR 的反馈常数列表。 16 位 LFSR 列表有 2048 个条目。

使用 LFSR 混淆数据:

只要您的 LSFR 最初包含一个非零值,它就会在每次迭代中逐步执行一系列 65535 (216–1) 个伪随机值。只需将这些值与您的数据进行异或以混淆它,然后使用相同的数字序列重复该过程以检索原始数据。要混淆一系列字节值,您可能会发现在每次迭代时仅提取 8 位更容易。

这里有一些示例代码可以完成这项工作。如果您要混淆文本字符串,则需要跟踪其长度,因为混淆后的字符串很可能包含空字节:

#include <stdio.h>
#include <string.h>

/* In-place string obfuscation */
void lfsr16_obfuscate(char *s, int length, unsigned short seed) {
    int i, lsb;

    for (i=0; i<length; i++) {
        s[i] ^= seed & 0x00ff;
        lsb = seed & 1;
        seed >>= 1;
        if (lsb) seed ^= 0xB400u;
    }
}


int main(void) {
    int i, n;
    char message[] = "Hello world";

    printf("Original message: %s\n", message);
    n = strlen(message);

    /* Obfuscate the message */
    lfsr16_obfuscate(message, strlen(message), 0xACE1u);
    printf("Obfuscated results (in hex):");
    for (i=0; i<n; i++) printf(" %02hhx", message[i]);
    putchar('\n');

    /* Repeat the obfuscation process to retrieve original message */
    lfsr16_obfuscate(message, strlen(message), 0xACE1u);
    printf("Recovered message: %s\n", message);

    return 0;
}