Реализация LFSR - C (СИ)
Формулировка задачи:
Вопрос касается реализации LFSR. В "Прикладной криптографии" Шнайера даётся пример реализации LFSR для многочлена:
В j получаю M-последовательность для кодирования.
Пробывал написать для многочлена (для проверки). Получаю нужную последовательность.
А как написать для ?
Мой вариант выдаёт одни нули:
AnsiString j=""; static unsigned long ShiftRegister=1; for (int i=0;i<30;i++) { ShiftRegister=(( ((ShiftRegister >> 31) // 32 ^(ShiftRegister >> 6) // 7 ^(ShiftRegister >> 4) // 5 ^(ShiftRegister >> 2) // 3 ^(ShiftRegister >> 1) // 2 ^(ShiftRegister )) // 1 & 0x00000001) <<31)|(ShiftRegister >> 1); j=j+(ShiftRegister & 0x00000001); } Form1->Edit3->Text=j;
ShiftRegister=(( ((ShiftRegister >> 28) ^(ShiftRegister >> 1) ) & 0x00000001) <<28)|(ShiftRegister >> 1);
Решение задачи: «Реализация LFSR»
textual
Листинг программы
void GetAllStates() { //для [5, 3, 0] static unsigned long ShiftReg = 1; for (int i=0; i<31; i++) { ShiftReg = ((( (ShiftReg>>4)^(ShiftReg>>2)^ShiftReg) & 1) << 4 ) | (ShiftReg>>1); AllStates.push_back(ShiftReg & 1); } }
Объяснение кода листинга программы
- В данной функции реализована генерация всех состояний регистра сдвига с использованием LFSR (Linear Feedback Shift Register).
- Переменная
ShiftReg
инициализируется значением 1. - В цикле
for
с переменнойi
от 0 до 30 происходит генерации всех состояний регистра сдвига. - В каждой итерации цикла происходит обновление значения регистра сдвига в соответствии с алгоритмом LFSR.
- Значение регистра сдвига
ShiftReg
уменьшается на 1 бит при каждой итерации цикла. - В каждой итерации цикла в вектор
AllStates
добавляется значение одного бита регистра сдвига. - После завершения цикла все состояния регистра сдвига будут присутствовать в векторе
AllStates
.