Какой тип шифрования использовать для 48-битных или 48-битных? - PullRequest
3 голосов
/ 02 сентября 2010

У меня есть набор из 48-битных (6-байтовых) значений, которые мне нужно шифровать симметрично. Два требования:

  1. Полученное зашифрованное значение также должно иметь длину 48 бит (6 байтов). Сам ключ может быть (и желательно) намного дольше, чтобы снова охранять атаки грубой силы.

  2. Полученное зашифрованное значение должно быть детерминированным, то есть значение A с использованием ключа B всегда будет создавать зашифрованное значение C (мы шифруем на лету и показываем зашифрованные данные пользователю, поэтому необходимо всегда показывать одно и то же значение)

Все найденные мною блочные шифры использовали минимальный размер блока 64 и кажутся фиксированными (вы не можете использовать произвольный размер блока). Должен ли я думать о потоковом шифре?

Я делаю это на Java.

Примечание: я видел этот вопрос и связанные с ним ответы, но не было ясно, удовлетворят ли предложения моему 2-му требованию.

Ответы [ 6 ]

5 голосов
/ 02 сентября 2010
4 голосов
/ 02 сентября 2010

(Извините, я изначально неправильно прочитал требования, полагая, что это входные данные, которые должны были быть 6 байтов.)

Я не думаю, что вы можете делать именно то, что вы хотите с помощью стандартных криптографических алгоритмов:

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

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

Итак, я бы предложил следующие варианты:

  • ослабить требование 48-битного зашифрованного текста; например, TripleDES имеет 64-битный размер блока и является «довольно» безопасным (эквивалентно 112-битной безопасности) [*];
  • в принципе, вы могли бы реализовать свой собственный блочный шифр с любым размером блока, который вам нужен, придерживаясь как можно ближе к стандартной конструкции, например сеть Фейстеля, следуя некоторым общепринятым принципам проектирования - в качестве отправной точки см. Шнайер, «Прикладная криптография», с. 346ff, «Теория проектирования блочных шифров».

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

Я бы также рекомендовал немного отойти от проблемы (или, возможно, объяснить немного больше, что вы пытаетесь сделать), потому что, похоже, он основан на требованиях, которые обычно идут вразрез с хорошей практикой безопасности (имея такую ​​же Например, открытый текст всегда шифруется до одного и того же зашифрованного текста, чего обычно следует избегать). Таким образом, у вас может быть самый лучший в мире шифр Фейстеля, но вы можете использовать еще одну уязвимость в том, как вы его используете.

[*] TripleDES, как правило, не рекомендуется, потому что AES обеспечивает более высокую безопасность более эффективно (вы можете увидеть некоторые сравнительные тайминги блочных шифров , которые я взял в Java, чтобы увидеть, насколько это плохо). Однако это может не иметь значения в вашем конкретном приложении.

Нет, просто «дополняйте» свои данные некоторыми байтами, которые вам не нужны (но всегда одинаковы, если это ваше требование), чтобы вы достигли размера блока. (Если вы используете соответствующий режим заполнения , тогда это будет сделано за вас.)

2 голосов
/ 04 июля 2015

Я считаю, что это то, что вы ищете
http://web.cs.ucdavis.edu/~rogaway/papers/shuffle.html
Этот алгоритм позволяет создавать PRP (то есть блочный шифр произвольной длины) из защищенного PRF (например, sha256, blake2)

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

1 голос
/ 03 сентября 2010

Если у вас есть уникальный счетчик / порядковый номер, связанный с каждым значением открытого текста, то вы можете просто использовать любой блочный шифр в режиме CTR (счетчик).

Для шифрования значения V, которое является порядковым номером N под ключомK:

  • Развернуть N до размера блока;
  • Зашифровать N с помощью блочного шифра и ключа K;
  • Взять первые 48 битов результатаи XOR их с V.

Расшифровка - то же самое.При использовании этого метода следует помнить следующее:

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

Порядковые номера должны быть уникальными,Если ваша последовательность перезапускается, вы должны использовать новый ключ.

1 голос
/ 02 сентября 2010

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

Если у вас есть такие уникальные значения (например, порядковый номер, который уже связан с вашими значениями), вы можете использовать, например, потоковый шифр RC4-капля .

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

Что касается блочного шифра с 48 битами - извините, я тоже не знаю такого шифра. Возможно, что вы можете сделать, это объединить четыре 48-битных значения в 192-битное значение, в результате чего получится три 64-битных блока, закодировать их, а затем снова разделить на четыре 48-битных значения. (Понятия не имею, возможно ли это в вашей ситуации или нет?)

0 голосов
/ 10 апреля 2016

В 2009 году был разработан 48-битный блочный 80-битный ключевой шифр - KATAN48 (семейная версия KTANTAN48 имеет некоторые проблемы с планированием ключей. До сих пор он не был взломан и имел достаточно высокие запасы безопасности, поэтому он имеет выдержал испытание временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...