1

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

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

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;
}
4

1 回答 1

3

您从中获得的 Wikipedia 文章有一个说明代码在做什么的插图:

16 位 LFSR

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

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

其他 LFSR:

此页面包含与不同长度的 LFSR 一起使用的反馈常数列表。16 位 LFSR 列表有 2048 个条目。

使用 LFSR 混淆数据:

只要您的 LSFR 最初包含一个非零值,它就会在每次迭代中逐步遍历 65535 (2 16 –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;
}
于 2017-06-16T08:26:38.730 回答