线性反馈移位寄存器解释
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;
}
我想使用线性反馈移位寄存器混淆字符串,所以我试图理解下面的 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;
}