线性反馈移位寄存器解释

时间:2017-06-16 08:14:59

标签: c encoding obfuscation lfsr

我想使用线性反馈移位寄存器对字符串进行模糊处理,因此我尝试理解wiki的以下代码 在下面的线性反馈移位寄存器的wiki示例中,' 0xACE1u '是用作开始状态的十六进制值,但我不明白这是什么 0xB400u

有人可以解释这是什么吗?任何解释如何使用LFSR来混淆字符串的链接都将受到赞赏

t=# do
$$
declare
 _r record;
 _t text;
begin
for _r in (select relname,relnamespace::regnamespace  from pg_class where relname like '%_id_seq') loop
  execute format('select last_value from %I.%I',_r.relnamespace,_r.relname) into _t;
  raise info '%', 'seq: '||_r.relname||', last_value: '||_t;
end loop;
end;
$$
;
INFO:  seq: test_table_id_seq, last_value: 3
INFO:  seq: json_test_id_seq, last_value: 4
INFO:  seq: test_a_id_seq, last_value: 1
INFO:  seq: customer_id_seq, last_value: 4
INFO:  seq: customerstatus_recordid_seq, last_value: 8
INFO:  seq: customerstatus_id_seq, last_value: 1
INFO:  seq: t1_id_seq, last_value: 16
INFO:  seq: s100_serial_id_seq, last_value: 8
INFO:  seq: t2_id_seq, last_value: 4
DO

1 个答案:

答案 0 :(得分:3)

The Wikipedia article you got this from有一个说明,解释代码正在做什么:

16-bit LFSR

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

(注意:没有XOR门进入16位,因为第17位没有输入。)

其他LFSR:

This page包含与不同长度的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;
}