Рейтинг:0

Алгоритм симметричного шифрования на основе умножения

флаг tf
Tom

Меня давно интересовал этот абзац:

Умножение — отличная функция смешивания. Если вы разберетесь, как выглядит умножение с точки зрения AND и XOR, станет очевидным, насколько сложным является 64-битное умножение. Количество транзисторов, необходимых для аппаратной реализации, не позволяет использовать умножение в большинстве криптографических алгоритмов. Но для некриптографических PRNG, которые должны работать только на ЦП общего назначения, умножение очень полезно, поскольку уже существует аппаратная реализация.

https://tom-kaitchuck.medium.com/designing-a-new-prng-1c4ffd27124d

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

Модульное умножение медленнее, чем сложение, но, вероятно, не намного медленнее, и наверняка это более сильная функция микширования. Умножение на самом деле является отличной функцией смешивания, так почему же оно так редко используется в симметричной криптографии? Я думаю, что даже смартфоны могут очень быстро выполнять 64-битное умножение и имеют некоторую аппаратную реализацию для умножения (но я не уверен).

Действительно ли медлительность умножения настолько большая проблема, что умножение не может найти широкого применения в быстрых облегченных алгоритмах шифрования? Вероятно, для устройств Интернета вещей или чипов RFID это может быть проблемой, но когда дело доходит до компьютеров и смартфонов, алгоритм шифрования, основанный на умножении, не может быть проблемой, не так ли?

phantomcraft avatar
флаг pf
Если процессор не имеет целочисленного аппаратного множителя, это не должно быть проблемой. Проблема начинается при использовании в очень маленькой среде, такой как смарт-карты, когда крошечный процессор выполняет только очень простые операции, как те, которые вы указали,
Рейтинг:5
флаг my

Действительно ли медлительность умножения настолько большая проблема, что умножение не может найти широкого применения в быстрых облегченных алгоритмах шифрования? Вероятно, для устройств Интернета вещей или чипов RFID это может быть проблемой, но когда дело доходит до компьютеров и смартфонов, алгоритм шифрования, основанный на умножении, не может быть проблемой, не так ли?

Часть проблемы, по-видимому, заключается в определении «облегченного» и предполагаемых платформах, на которые он нацелен. Процессоры смартфонов на самом деле вполне способны; Я бы не назвал эти платформы (или переносные компьютеры) обязательно «легковесными». Облегченная криптография обычно разрабатывается с учетом микроконтроллеров; как правило, эти микроконтроллеры не имеют встроенных инструкций умножения 64x64 бит.

Теперь модульное умножение (для модуля степени 2) можно реализовать с помощью серии сдвигов и условных сложений; конечно выполнимо, но значительно дороже, чем операция сложения.

Другая проблема заключается в том, что модульное умножение не так прекрасно, как вы надеялись. Для этого обсуждения я ограничу свое обсуждение умножением по модулю степени 2 (множественный по модулю простого числа не имеет этих проблем; у них есть проблемы в диапазоне, не являющемся степенью 2).

  • Модульное мультикатионирование не имеет распространения «правильного слова»; например, изменение старшего бита одного из входов повлияет только на старший бит выхода; остальные биты не затрагиваются. Конечно, модульное добавление имеет ту же проблему; однако это и дешевле.

  • Модульное умножение имеет сильные дифференциалы; самый сильный основан на идентичности $(-x)*y = -(x*y)$ (и операция по модулю не нарушает этого).

Обе эти проблемы могут быть решены в правильном дизайне; однако тот факт, что вы должны это сделать, делает его менее привлекательным. Кроме того, напрашивается вопрос: почему бы не использовать умножение в $GF(2^k)$ вместо? Если мы делаем реализацию сдвига/сложения, реализация умножения Галуа с двойным/исключающим ИЛИ ненамного дороже и позволяет избежать двух вышеупомянутых проблем...

Tom avatar
флаг tf
Tom
Конечно, умножение по модулю 2^n имеет большие проблемы со смешиванием битов (особенно младших), поэтому мы объединили его с xor и поворотом. Но, насколько я знаю, дополнение имеет еще большие проблемы этого типа. Я не уверен, но, вероятно, даже более сильные дифференциалы.
Tom avatar
флаг tf
Tom
Может ли умножение GF(2^k) быть таким же быстрым, как умножение 64-битных чисел по модулю 2^64? Я думаю, что это должно быть GF (2 ^ 64), чтобы получить такое же количество битов.
poncho avatar
флаг my
@Tom: очевидно, любой такой ответ будет сильно зависеть от оборудования. Я полагаю, что на больших процессорах у них есть операции «умножения без переноса»; необходимое исправление не бесплатно, так что это будет медленнее, чем прямое умножение 64x64, но это было бы неплохо. На небольших процессорах (без умножения) двойное/условное xor $GF(2^{64})$ с постоянным временем должно быть близко к аналогичному умножению сдвига/условного добавления 64x64...
Tom avatar
флаг tf
Tom
Я сделал 32-битный генератор LCG и генератор LCG в GF(2^32). А умножение в GF(2^32) немного хуже в PractRand. Похоже, есть проблемы и с младшими битами. Других дифференциалов не будет? Я не уверен. Кажется, что умножение в GF(2) смешивает биты не лучше. Или, может быть, главное преимущество в том, что сложнее найти мультипликативную обратную?
poncho avatar
флаг my
@Tom: преимущество умножения GF заключается в следующем: если $a \ne 0$ и $b$ неизвестны и равномерно распределены, то $a \times b$ также будет равномерно распределено. Это неверно для умножения по модулю степени 2, если $a = 2$, а $a \times b$ всегда будет четным.
Рейтинг:4
флаг ye

Блочный шифр ИДЕЯ с 1991 г. используется мод модульного умножения $2^{16}+1$ для диффузии (где 0 отображается на $2^{16}$).

Поскольку делители нуля не годятся с криптологической точки зрения, модуль должен быть простым и иметь форму $2^б+1$ поскольку кто-то предпочитает работать с битами (а не использовать 0), поэтому $b=2, 4, 8, 16$ ($б=1$ будет линейным).

Если вы разработаете шифр, используя эти модульные умножения, вы столкнетесь (как минимум) с двумя проблемами:

  • криптографические свойства модульных умножений плохо изучены, поэтому вам трудно показать, что ваш шифр хорош
  • для небольших устройств необходимо учитывать атаки по сторонним каналам, но трудно защитить эти модульные умножения от них (особенно от DPA; но уже атаки по времени могут быть проблемой, если умножение не постоянное время)
poncho avatar
флаг my
Я бы сказал, что криптографические свойства модульного умножения понятны. Кроме того, что касается DPA, модульное умножение является пороговым, основанным на тождестве $(A+B)*(C+D) = (A*C + B*D) + (A*D + B*C )$ (который очевидным образом расширяется для пороговой обработки с 3+ путями)
Tom avatar
флаг tf
Tom
Атаки по сторонним каналам и атаки по времени — это действительно проблема, которую нужно учитывать, я забыл об этом. Однако разве дополнение не так же уязвимо для таких проблем? Или, может быть, это не потому, что мы можем легко преобразовать его в сдвиг и xors, которые являются постоянным временем?
poncho avatar
флаг my
@Tom: основная проблема с синхронизацией и умножением возникает на младших платформах, на этих платформах инструкция умножения может не быть постоянной по времени (например, останавливаться, когда в одном из операндов заканчиваются биты «1»). Теперь вы можете реализовать умножение с постоянным временем на этих платформах; однако крипто-наивный разработчик может этого не сделать. Напротив, ЦП почти всегда реализуют сложение за постоянное время...
Tom avatar
флаг tf
Tom
Еще один вопрос. Чтобы получить аналог 64-битного умножения (mod 2^64), какой GF нужно использовать? Я хочу умножить 64-битные числа и получить 64-битные результаты. Я прав, я должен использовать GF (2 ^ 64)? Везде есть примеры GF(2^8), AES тоже работает с GF(2^8), но работает с байтами.Если кто-то хочет заменить 64-битное умножение, он должен использовать GF (2 ^ 64), я прав? Или, может быть, это может быть что-то другое, как в AES GF (2 ^ 8), но по байтам? Тогда правила такой арифметики немного другие, чем в GF(2^64), если я правильно понимаю.
флаг ye
@poncho: Формулы, которые вы дали для пороговых реализаций, скрывают две проблемы с реализацией: добавление по модулю $2^{16}+1$, поэтому аддитивные доли не умещаются в 16 бит, и вам нужно легко реализуемое модульное сокращение , но вы должны учитывать, что нередуцированные значения видны злоумышленнику (через DPA). Но настоящие проблемы для DPA-безопасной реализации проявятся, когда вы смешиваете модульное умножение с другими операциями, такими как xor или сложение по модулю $2^{16}$, поскольку вам приходится переключаться между различными операциями маскирования, что нетривиально. (и занимает много времени).
флаг ye
@Tom: Вы знаете, что умножение в поле с элементами $2^{64}$ сильно отличается от умножения по модулю $2^{64}$?
Tom avatar
флаг tf
Tom
@garfunkel да, это другое, я знаю. Я изучил этот предмет и написал свои собственные программы умножения и даже функцию умножения GF(2^128), основанную на режиме GCM и инструкциях pclmulqdq.
флаг ye
@Tom: (Из вашего письма я подумал, что вы знаете, и спросил, просто чтобы быть уверенным.) Два дополнительных различия между использованием мода умножения $2^{16}+1$ (с использованием всех элементов поля, кроме 0) и умножением в поле с $2^{16}$ (используя все элементы поля, включая 0), состоит в том, что последний всегда имеет 0 в качестве фиксированной точки, и, что гораздо важнее, последний является линейным над F2 ("xor"), поэтому упускает один существенный свойство криптографического S-Box. Так что, как и в AES, вам, возможно, придется использовать инверсию над полем с элементами $2^{64}$.
Рейтинг:0
флаг ca

Шифрование любого типа требует больших затрат аппаратного обеспечения и мощности. Умножители действительно большие, глубокие и, следовательно, медленные по сравнению с базовым полным сумматором ALU. Я собираюсь помахать руками, но если вы возьмете книгу по архитектуре ЦП, вы найдете следующее: Дизайн множителей всегда разный, но модульный конвейер MUL для 64-битного результата равен 4. -deep, а для 128-битного результата - 8-битный на большинстве процессоров. Это связано с тем, что вы используете связанные блоки полных сумматоров, а максимальная глубина в 4-уровневом дизайне составляет 16. Глубина полного сумматора для XOR, ROL или ADD эквивалентна одному полному сумматору. Супермасштабирующие процессоры скрывают большую часть задержек множителей; однако, если вы действительно усердно работаете над проблемой, вы найдете пустой конвейер с большим количеством задержек.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.