Введение

В теории кодирования хорошо известны регистры сдвига с линейной обратной связью (РСЛОС или LFSR -- Linear Feedback Shift Register), которые применяются, например, для:

  • помехоустойчивого кодирования;

  • хеширования;

  • расширения спектра сигнала в системах с кодовым разделением канала;

  • скремблирования данных с целью стабилизации спектра формируемого сигнала;

  • генерации псевдослучайных чисел;

  • ...

Как правило, регистры сдвига оперируют битами, выполняя суммирование по модулю два. Исключением являются помехоустойчивые коды Рида-Соломона, которые по определению не являются двоичными. Что касается криптографических применений РСЛОС, то здесь ситуация сложнее.

В качестве криптографического ядра РСЛОС не используются из-за линейности таких генераторов и, соответственно, возможных атаках. Однако, они используются как "связывающий" элемент при шифровании некоторого сообщения, поделенного на блоки стандартной длины. Связывание блоков одного сообщения позволяет увеличить криптостойкость базового алгоритма, потому что при последовательном шифровании одинаковых блоков мы получим разные шифр-тексты.

Предлагается для большей стойкости и возможности масштабирования в качестве базовой криптографической ячейки использовать РСЛОС, оперирующие не битами, а числами по модулю некоторого простого числа, скажем p.

Предлагается вариант комбинации таких p-ячеек, основанный на исключающем побитовом ИЛИ в некотором контейнере (например, байте при p<256), что позволит полноценно выполнять шифрование, т.к. контейнерное ИЛИ не равнозначно сумме по модулю p, в которой работает p-ячейка.

Предлагается вариант линейной комбинации для фиксированной p-ячейки, который позволит генерировать общий секрет при установлении сессии клиент-сервер, при этом не используется факторизация больших целых чисел.

Предлагаемая криптографическая архитектура хорошо ложится на параллелизм современной вычислительной техники (16/32/64 ядра).

Конечно, предлагаемая архитектура требует экспертизы со стороны криптографического сообщества и проверки временем.

РСЛОС по простому модулю

В общем случае РСЛОС содержит в себе m ячеек, которые хранят целые числа по модулю p. Вектор из m чисел называется вектором состояния регистра или просто состоянием. Слово "сдвиг" означает следующий такт. На следующем такте состояние регистра меняется. Начиная с некоторого такта можно получить первоначальное состояние, при этом пройденное количество тактов называют периодом генератора.

Пересчет состояния регистра ведется по линейным правилам, поэтому обратные связи называют линейными. Это значит, что отклик генератора на сумму возбуждающих последовательностей равен сумме откликов генератора на каждую из них. Более того, сохраняется пропорция (масштабирующий коэффициент) откликов.

Алгоритм пересчета состояния \vec x следующий:

  1. Последовательно для всех i=\overline{m-1, 1} выполнить x[i] = (x[i-1] + vK[i]) \mod p

  2. Закрепить последний элемент x[0] = vK[0] \mod p

  3. Обновить выходное значение v = x[m-1]

Здесь \vec K -- вектор коэффициентов генератора, определяющий период генератора.

Перед тем, как определять период генератора, его устанавливают в единичное состояние \vec x = (1, 0, 0, ..., 0), v=x[m-1], и прогоняют m раз для насыщения. Вообще говоря, можно установить в любое ненулевое состояние \vec x \neq 0 и прогнать m раз, чтобы состояние стало "своим". В этом есть аналогия с помехоустойчивыми кодами, где имеются разрешенные кодовые слова и запрещенные.

Приведенный алгоритм легко ложится на схему с регистром сдвига, умножителями и сумматорами. В принципе, данные уравнения основаны скорее на схеме, чем на алгебраических предположениях. Хотя с точки зрения алгебры, выход генератора -- это частное от деления степеней x^m на так называемый генераторный полином g(x) = x^m - K[m-1]{x}^{m-1} - ... - K[1] x - K[0], а состояния генератора -- это соответствующие остатки от деления.

Так как число разных состояний равно p^m, то период T не может быть больше этого числа. Нулевое состояние исключается, поэтому T \le {p}^{m} - 1. Генераторы с максимальным периодом генерируют последовательности максимальной длины или М-последовательности. Естественно, что для криптографии интересны именно такие генераторы, либо близкие к ним.

Одна из проблем заключается в том, что отсутствуют рецепты для отыскания "правильных" коэффициентов генератора. Однако, есть предварительно просчитанные таблицы, особенно для двоичных генераторов когда p=2 ввиду их широкого применения. Проверено, что для произвольного простого p<256 есть возможность относительно быстро посчитать хорошие генераторы для регистра длиной m=4. Например, для p=251 и m=4 существует более 6000 хороших генераторов. Такие генераторы эквивалентны в смысле периода двоичным генераторам с периодом ~{2}^{32}.

Так как период {2}^{32} по современным меркам не очень велик, то хочется как-то увеличить его не прибегая к более длинным регистрам. Предлагается объединить два генератора с одинаковой длиной m и модулем p, но с разными периодами.

Парное объединение генераторов с одним модулем

Если объединить два генератора с одинаковым периодом, то общий период будет тем же самым и такое объединение теряет смысл. Необходимо чтобы периоды были разными.

Известно, что общий период равен наименьшему общему кратному (НОК) периодов T = LCM(T_1, T_2). В свою очередь НОК тем больше, чем меньше наибольший общий делитель (НОД).

Путем численного моделирования показано, что генераторы из m ячеек могут иметь периоды {T}_{2} = {p}^{m-1} - 1 (малый период) и {T}_{1} = {p}^{m} - 1 (большой период). Доказано, что НОД этих периодов равен p-1. Значит общий период равен T = ({p}^{m-1} - 1)(p^m-1)/(p-1) \approx ({p}^{m-1})^2 \approx (T_2)^2.

Получили, что период объединенного генератора равен квадрату малого периода. Для рассмотренных ранее параметров период равен примерно {2}^{48}, то есть вместо 32-х битов получили почти 48 битов, не увеличивая длину регистра (напомним, более длинный регистр требует более долгого поиска правильных коэффициентов).

Объединять два генератора можно по-разному. Возможна сумма по модулю p, возможно побитовое исключающее ИЛИ, если содержимое ячеек хранить в некотором фиксированном регистре. Допустим, при p<256 разумно использовать байтовую ячейку, при p<65536 -- двухбайтовую ячейку и т. д.

Предлагается использовать вариант с побитовым исключающим ИЛИ, так как он более стоек к атакам -- эта операция не согласована с линейными свойствами арифметики по модулю p. Например, 123 + 231 = 354 = 103 \mod 251, но 123 \oplus 231 = 156 \neq 103. То есть два генератора сами по себе работают в арифметике по модулю p, а объединяющий оператор -- нет, что затрудняет анализ такой суммы. Также операция ИЛИ сохраняет баланс нулей и единиц, в отличие, например, от операции И.

Конечно, можно объединять четыре разных генератора: два с малым периодом, два с большим, однако общий период от этого не изменится.

Сочетание парных генераторов по набору модулей

Так как простых чисел p много, то предлагается объединить рассмотренные выше парные генераторы побитовым исключающим ИЛИ. Общий период будет равен НОК периодов всех парных генераторов. В настоящее время общий период несложно посчитать используя арифметику длинных целых чисел.

Ограничиваясь, например, 131 \leq p \leq 251, а также m=4, можно получать периоды вплоть до примерно 500 битов, при этом объединенный генератор будет содержать примерно 22 пары. Путем численного моделирования можно подобрать оптимальное сочетание простых чисел.

Алгоритм генерации общего секрета

Генерация общего секрета необходима при передаче шифрованного сообщения из точки А в точку Б по той причине, что единый ключ шифрования не должен передаваться по сети в открытом виде. Он должен быть каким-то образом зашифрован, но так, чтобы не создавать нового ключа шифрования, что опять бы породило проблему передачи ключа и т. д.

Существует алгоритм генерации общего секрета на основании разложения числа на простые множители и алгебраического равенства {({G}^{m})}^{n} = {({G}^{n})}^{m}, алгоритм Диффи-Хеллмана. Однако, он требует применения специфических алгоритмов, и не известно к чему приведет развитие математики в плане ускорения таких алгоритмов и, значит, увеличения вероятности взлома.

Предлагается передавать сумму W_A =P \cdot (x^m + x^n) \mod g(x) со стороны абонента А и сумму W_B = Q \cdot (x^p + x^q) \mod g(x) со стороны абонента Б, где g(x) -- общий заранее известный генератор, работающий в арифметике по модулю p, а набор P, m, n, Q, p, q -- случайные секретные коэффициенты: три первых известны только А, три других известны только Б.

Заметим, что сумма -- это состояние регистра, то есть m чисел по модулю p.

Операция x^m \mod g(x) означает прогон некоторого начального вектора m раз через генератор g(x). Умножение на P -- это поэлементное умножение итогового результата (состояния регистра) на P и приведение его по модулю p.

Формируемые суммы могут содержать более двух слагаемых для увеличения криптостойкости.

В данном случае сумма -- это сумма по модулю p, что позволяет генерировать общий секрет. Операция ИЛИ, к сожалению, здесь не подходит, однако криптостойкость можно регулировать количеством слагаемых.

Сумма {W}_{A}, переданная абоненту Б, подвергается операции, известной Б -- этой суммой инициализируется генератор и делается прогон p раз и q раз, результаты складываются и всё это умножается на Q, -- в результате чего формируется сумма {W}_{AB}, а сумма {W}_{B}, переданная абоненту А, подвергается операции, известной А -- этой суммой инициализируется генератор и делается прогон m раз и n раз, результаты складываются и всё это умножается на P, -- в результате чего формируется сумма {W}_{BA}.

Общий секрет (ключ шифрования) равен W ={W}_{AB} + {W}_{BA}.

Вероятно, для генерации общего секрета лучше использовать генераторы с длиной m=6, а для основного шифрования -- наборы генераторных пар длиной m=4.

На практике, поиск генераторной пары для m=6 и p=251 может занимать 2...3 суток на одном ядре процессора, что, в принципе, осуществимо. Для m=7 среднее время поиска прогнозируется примерно в 250 раз больше -- вероятно, это недостижимый случай...

Заключение

Предложена архитектура Full-stack шифрования на обобщенных LFSR регистрах:

  • Парные генераторы длиной m, модулем p и общим периодом \approx {p}^{2m-2}, с нелинейным выходом, формируемым контейнерным исключающим ИЛИ

  • Сочетание парных генераторов с разными модулями на основе контейнерного исключающего ИЛИ

  • Алгоритм генерации общего секрета, основанный на обмене суммами (состояниями регистра) по модулю p, формируемыми базовыми p-ячейками.

Предложенная архитектура требует экспертизы со стороны криптографического сообщества и проверки временем.

Комментарии (3)


  1. markdaniLov4986
    18.04.2023 05:40

    Full-stack шифрование на обобщенных регистрах с линейной обратной связью (LFSR) является методом шифрования, который использует последовательность битов, генерируемых LFSR, для зашифровки данных. LFSR - это регистр, состоящий из нескольких битов, который генерирует последовательность битов, используя линейную обратную связь.

    Процесс шифрования на LFSR начинается с инициализации регистра начальным значением. Затем регистр сдвигается на один бит вправо, и новый бит генерируется путем комбинации нескольких битов регистра с помощью линейной обратной связи. Этот процесс повторяется до тех пор, пока не будет сгенерирована достаточно длинная последовательность битов для зашифровки данных.

    Для зашифровки данных на LFSR используется операция XOR между каждым битом данных и соответствующим битом последовательности, сгенерированной LFSR. Результатом этой операции является зашифрованный бит данных.

    Full-stack шифрование на LFSR может быть использовано для защиты данных в различных приложениях, таких как телекоммуникации, банковское дело, электронная коммерция и другие. Однако, как и любой другой метод шифрования, он не является абсолютно безопасным и может быть взломан при помощи атак криптоанализа.


    1. sci_nov Автор
      18.04.2023 05:40

      Я бы не спешил с такими выводами.


    1. sci_nov Автор
      18.04.2023 05:40

      У меня не битовый генератор.