Loading AI tools
Из Википедии, свободной энциклопедии
HPC (Hasty Pudding Cipher) — блочный симметричный криптоалгоритм, созданный известным американским криптологом и математиком Ричардом Шреппелем[англ.] из Университета штата Аризона в 1998 году. Первые два слова названия криптоалгоритма можно перевести как «мучной заварной пудинг». Столь странное название HPC получил, по всей видимости, из-за обилия «хитрых» числовых преобразований, что существенно затрудняет его анализ.
HPC основан на ячейке Фейстеля и имеет интересную особенность — размер как шифруемого блока, так и ключа шифрования не ограничен ничем. Фактически, алгоритм HPC состоит из пяти различных(но взаимосвязанных) субалгоритмов, каждый из которых предназначен для шифрования блоков различной длины:
Название | |
---|---|
HPC-Tiny | |
HPC-Short | |
HPC-Medium | |
HPC-Long | |
HPC-Extended |
Шифрование выполняется в 8 раундов. Шифруемый 128-битный блок записывается в два 64-битных регистра и , после чего над ними производится огромное число различных математических операций:
Обозначение | Операция |
---|---|
сложение по модулю 2 | |
сложение по модулю | |
вычитание по модулю | |
циклический сдвиг влево на n разрядов | |
циклический сдвиг вправо на n разрядов | |
обнуление младшего байта 64-битного блока | |
побитовое логическое "и" |
Кроме того,в раунде также принимают участие некоторые константы:
По завершении 8 раундов преобразования производится ещё 2 операции:
Расшифровка производится посредством выполнения обратных операций в обратном порядке.
Задача процедуры расширения ключа - формирование расширенного ключа, являющегося массивом из 256 64-битных слов. Понятно, что для каждого из субалгоритмов должна быть своя процедура. Знание одного из массивов расширенного ключа не позволяет вычислить ни другие массивы, ни сам ключ шифрования. Однако, при фиксированном размере шифруемых блоков достаточно один раз сформировать расширенный ключ для данного субалгоритма.
Остальные 253 слова ключа инициализируются следующим образом:
Производится побитовое сложение по модулю 2 ключа шифрования и проинициализированного массива расширенного ключа, но не более 128 слов.
Выполняется функция перемешивания данных расширенного ключа, которая обеспечивает влияние каждого бита ключа на каждый бит расширенного ключа:
Выполняется инициализация регистров :
Для каждого слова расширенного ключа выполняется операция, приведённая на рисунке. Для усиления эффекта автор алгоритма рекомендует проводить 3 раунда перемешивания.
Если размер ключа превышает 128 64-битных слов, то для каждого блока из 128 слов повторяются Этапы 2 и 3. Таким образом, процедура перемешивания ключей по порядку сложности примерно похожа на саму процедуру шифрования.
Его назначение - модифицировать результат шифрования при одинаковых входных блоках и ключах. Дополнительный ключ может быть секретным, что увеличивает фактический объём ключевой информации, однако в алгоритме с неограниченной длиной ключа такая возможность может быть лишней. В таких случаях можно просто обнулить дополнительный ключ.
Дэвид Вагнер[англ.] обнаружил уязвимость в шифре HPC[7], а позднее Carl D’Halluin, Gert Bijnens, Барт Пренель и Винсент Рэймен опубликовали статью[8], подтверждающую это. Оказалось, что примерно каждый 256-й ключ алгоритма имеет 230 эквивалентных ключей. Однако, этот недостаток был оперативно исправлен автором ещё до подведения итогов первого раунда конкурса.
При таком виде атаки злоумышленник, имея доступ к парам открытых и шифрованных текстов, может, манипулируя массивом дополнительного ключа "Spice", смотреть, как при этом меняется открытый или шифрованный текст в последующих шифрованиях. Однако, по словам автора, атак такого вида ещё не наблюдалось, а для работ в этой области нужны усилия криптоаналитического сообщества.[2]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.