1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Написать программу, реализующую алгоритм потокового шифрования содержимого текстового или двоичного файла. Программа должна запрашивать имя входного и выходного файлов, представление образующего многочлена и инициализирующее значение. Разрядность РСЛОС должна быть меньше или равной максимальной разрядности стандартных целочисленных типов данных (64 бит).
Вот на чём основываюсь (см. прикреплённый документ).. Как я поняла, основная задача - сгенерировать поток ключей..для этого и применяется РСЛОС (регистр сдвига с линейной обратной связью).. Есть некоторые вопросы по реализации: Пусть пользователь ввёл представление образующего многочлена, инициализирующее значение.. Используя эту информацию нужно некоторый n-битный регистр сдвига обинициализировать (и первый вопрос: как это осуществить?? что за инициализирующее значение задавать??)..чтоб в дальнейшем получать новый бит, выполняя XOR над определёнными битами..
Так... Это, похоже, неправильная функция. Правильнее (соответственно тому, что написано в той статье, на которую я давал ссылку выше, и готовой функции LFSR, которая приведена там) будет сделать ее вот так:
int LFSR(TMemo *MemoPolinom) { __int64 uL = 0; // Сначала заносим 0, а не первый сдвиг for (int i = 0; i < MemoPolinom->Lines->Count; i++) { // XOR-им с предыдущим значением SR, сдвинутым на _все_ заданные сдвиги uL ^= (ShiftRegister >> StrToInt(MemoPolinom->Lines->Strings[i])); } // Оставляем только последний бит от полученного числа uL &= 0x0000000000000001;
// Сдвигаем этот бит влево на _сколько нужно_ (согласно полиному) позиций uL <<= StrToInt(MemoPolinom->Lines->Strings[0]);
// и OR-им со сдвинутым на 1 вправо предыдущим значением SR uL |= (ShiftRegister >> 1);
// Все, у нас теперь в uL получилось новое значение SR, присваиваем его ShiftRegister = uL;
// И возвращаем последний бит этого нового SR как результат функции return ShiftRegister & 0x0000000000000001; }
Теперь функция делает абсолютно то же самое, что и та, готовая, которая приведена в статье... Раньше она делала не совсем то, что требовалось.
Спойлер(Показать/Скрыть)
Теперь. Поскольку функция изменилась, я ее, естественно, проверил. Так вот. Чем меньше начальное значение SR, тем меньше шифрованный текст отличается от открытого. Я проверил на SR = 134 и полиноме <60, 1, 0> твой текст, получилось:
int LFSR(TMemo *MemoPolinom) { // Оставляем только последний бит от полученного числа uL &= 0x0000000000000001;
}
А почему мы должны оставлять последний (младший) бит? Ведь насколько я поняла из статьи, левый бит является функцией всех остальных..а получается мы его не берём..?