我想使用线性反馈移位寄存器对字符串进行模糊处理,因此我尝试理解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
答案 0 :(得分:3)
The Wikipedia article you got this from有一个说明,解释代码正在做什么:
从移位寄存器末尾提取的最低有效位通过对位16,14,13和11进行异或反馈。当该位为零时,这没有效果,但是当它为1时,所有这些位都被翻转。最快的方法是使用0xB400计算16位移位寄存器的XOR乘积,其中所有这些位都设置为(二进制为1011010000000000)。
(注意:没有XOR门进入16位,因为第17位没有输入。)
This page包含与不同长度的LFSR一起使用的反馈常量列表。 16位LFSR列表有2048个条目。
只要您的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;
}