Рейтинг:1

RC6 Целочисленные операции по модулю 32 между двумя 32-битными блоками

флаг us

Я новичок в криптографии и пытаюсь закодировать алгоритм RC6 (Rivest cipher 6). Алгоритм требует сложения, вычитания и умножения по модулю 2.32. Если я выполняю эти операции между двумя 32-битными блоками, как это будет работать?

Любая помощь будет оценена по достоинству, потому что я не могу найти подробного объяснения по этому поводу, которое помогло бы мне написать код о том, как выполнять эти операции.

Рейтинг:1
флаг ru

Это будет зависеть от языка, на котором вы реализуете. Java и другие C-подобные языки имеют встроенный тип данных для представления 32-разрядных целых чисел без знака (вот почему RC6 решил использовать эту форму арифметики, чтобы ее реализация в эти языки относительно просты). В таких случаях +, - и * все автоматически работают мод $2^{32}$.

Если вы используете python, вы можете просто использовать оператор %, который возвращает мод остатков, независимо от указанного значения, например. а=(б+в)%(2**32).

A. Hersean avatar
флаг cr
Целые числа без знака не поддерживаются Java, за исключением байтов. Однако операции +, -, * и сдвиг влево ведут себя одинаково для целых чисел со знаком и без знака.
dave_thompson_085 avatar
флаг cn
@A.Hersean: ты имеешь в виду `char`s; Java `байт` подписан, что является большой неприятностью в криптографическом коде, где вы должны (помните) `&0xFF` или `(byte)` почти для всех ссылок, хотя JIT-компилятор может оптимизировать их в нечто вроде MOV. Б. (Но типы, которые действительно используются в стековой машине, `int` и `long`, определены как двойные дополнения точного размера с переносом, поэтому да, они эквивалентны unsigned для операций, которые вы перечисляете.)
флаг us
@A.Hersean Как мне использовать модуль 2 ^ 32 в Verilog?
флаг us
@ dave_thompson_085 Знаете ли вы, нужен ли `& 0xFF` в Verilog и как я могу реализовать арифметику по модулю 2 ^ 32?
dave_thompson_085 avatar
флаг cn
@tomneil: я вообще ничего не знаю о Verilog и не могу вам помочь. Если это важно для вашего вопроса, это должно быть _в_ вашем вопросе.
Рейтинг:0
флаг ng

Вы хотите работать по модулю $2^{32}$, за исключением количества смен, где это должно быть по модулю $32$.

Следующее является общим и работает в Python.

код (результат г) операция
г = (х+у)&0xffffffff 32-битное дополнение Икс и у
г = (х-у)&0xffffffff 32-битное вычитание Икс минус у
г = (х*у)&0xffffffff 32-битное умножение Икс и у
z = ((x<<(31&y))|(x>>(31&-y)))&0xffffffff 32-битное левое вращение Икс по младшим 5 битам у

В современном C или C++ используйте переменные типа uint32_t определено в заголовке <stdint.h> или же <cstdint>, и, при желании, удалить &0xffffffff.

В Java используйте переменные типа инт, удалить &0xffffffff, изменение >> к >>>.

флаг us
Поэтому, если бы я пытался сделать это в Verilog, мне также пришлось бы использовать переменную типа uint32_t и определить ? Тогда я мог бы использовать 32-битные операторы, просто используя обычные x+y, x-y, x*y и ((x>(31&-y)))?
fgrieu avatar
флаг ng
@tomneil: я предполагаю, что если он скомпилируется, он будет работать, и есть шанс, что он не будет сильно неэффективным благодаря автоматической оптимизации. Но тогда мой единственный контакт с Verilog — это помощь кому-то, кто его использует.

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

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