Рейтинг:3

Асимметричная схема шифрования с кратчайшим выходом для шифрования 1 байта информации

флаг cn

Представьте, что нужно периодически шифровать очень короткие сообщения (т. е. логическое Да/Нет, один байт или 3-4 байта в худшем случае). Мы предполагаем, что сеанса нет, и нам просто нужно зашифровать под открытым ключом получателя (т.е. отправить зашифрованный байт в блокчейн).

Я знаю о шифровании ElGamal, Cramer-Shoup, RSA, ECIES и т. д., и я ищу алгоритм с кратчайшим выходом при шифровании небольшого количества информации.

Я хочу поддерживать как минимум 128-битную защиту, поэтому мне интересно, существует ли вариант Эль-Гамаля, оптимизированный для коротких сообщений. Мы знаем, что ElGamal над эллиптическими кривыми выводит зашифрованные тексты размером 64 байта (при условии, что мы шифруем сообщение длиной до 32 байтов при использовании 256-битной эллиптической кривой).

Есть ли в литературе асимметричная схема, которая могла бы выводить меньше байтов, чем эта? в идеале 30-32 байта?

Рейтинг:3
флаг ng

Внезапно я предлагаю этот вариант EC-ElGamal на стандартной 256-битной эллиптической кривой, используя хэш-и-XOR для части шифрования (почти вдвое меньший размер зашифрованного текста по сравнению с учебником EC-ElGamal) и простой обмен работой/пространством. -off для дальнейшего сжатия сообщения в 32-байтовый зашифрованный текст $м$ из $b$ биты, с небольшим фиксированным $b$ (например. $б=8$).

  • Используйте стандартную эллиптическую кривую над полем $\mathbb F_p$ с генератором $G$ порядка $n$, с $р$ и $n$ 256-битные простые числа и (предположительно) 128-битная безопасность. секп256р1 (он же NIST P-256) и secp256k1 квалифицировать. я имею в виду сек1v2 для математики и нотации ECC.
  • Генерация ключей:
    • Выберите закрытый ключ $д$ случайным образом в промежутке $[1,n)$
    • Вычислить открытый ключ $Q\получает д\,G$
  • Шифрование $b$-битный открытый текст $м$
    • выберите $е$ случайным образом в промежутке $[1,2^{32})$
    • Вычислить $F\получает е\,G$
    • выберите $к$ случайным образом в промежутке $[1,n)$
    • Вычислить $R\получает k\,G$
    • Пока $R_x\not\equiv0\pmod{2^b}$
      • Вычислить $R\получает R+F$ и $k\получает k+e$, который поддерживает $R=k\,G$
      • Если $k\gen$ генератор случайных чисел, который выбрал $к$ скорее всего сломан; прервать или перезапустить шифрование
    • Если $R_y$ нечетный, набор $R_y\получает p-R_y$ и $k\получает n-k$, который поддерживает $R=k\,G$
    • Вычислить $S\получает k\,Q$ (общая секретная точка)
    • Вычислить $u\gets\operatorname{SHA-256}(S_x)\bmod2^b$, куда $S_x$ выражается как 32-байтовая строка байтов
    • Вычислить $v\получает u\oplus m$
    • Выходной шифртекст 256-бит, состоящий из $256-б$ биты для $R_x$ с низким порядком $b$ биты удалены (они равны нулю по построению), и $b$ биты для $v$
  • Расшифровка:
    • Из извлечения зашифрованного текста $R_x$ (вставка $b$ младшие биты в нуле) и $v$
    • Вычислить $R_y$ соответствие $R_x$ (это стандартный метод отмены точечного сжатия, см. Раздел 1v2 §2.3.4, шаг 2.4.1); если это не удается, прервите расшифровку.
    • Если $R_y$ нечетный, набор $R_y\получает p-R_y$
    • Вычислить $S\получает д\,R$ (общая секретная точка)
    • Вычислить $u\gets\operatorname{SHA-256}(S_x)\bmod2^b$, куда $S_x$ выражается как 32-байтовая строка байтов
    • Вычислить и вывести расшифрованный открытый текст $m\gets u\oplus v$

я предполагаю IND-CCA1 (таким образом Индивидуальная цена за конверсию) безопасность до 128-битного уровня при правдоподобных предположениях (сложность варианта решения задачи Диффи-Хеллмана для эллиптической кривой и SHA-256, смоделированного как случайный оракул). Существует тривиальная атака на IND-CCA2 (таким образом, доступ к оракулу дешифрования ставит под угрозу конфиденциальность прошлых сообщений, даже если оракул дешифрования внес исходные зашифрованные тексты в черный список; на практике это не проблема).

Остерегайтесь того, что шифр тривиально податлив. Это позволяет злоумышленнику перевернуть желаемые биты в открытом тексте, изменив эти биты в зашифрованном тексте. Это может быть практическим вопросом. Некоторый уровень смягчения этого возможен путем замены $u\oplus\ldots$ к Формат, сохраняющий шифрование с более широким $u$ как ключ; или/и больше работы или/и места.

Цикл while при шифровании — это компромисс между временем и пространством, поиск $к$ по перечислению, так что это $х$ координировать $R_x$ имеет $b$ младшие биты в нуле, которые не нужно передавать. Поиск оптимизирован, чтобы требовать $\приблизительно2^b$ точечные дополнения, но для $b$ начиная примерно $8$ это станет болью. Использование секретного приращения $e$ и соответствие $F=e\,G$ это приятно иметь в финале $к$ более однообразно (см. примечание), но я не знаю атаки, если мы возьмем $е=1$ и поэтому $F=G$. Дополнительное приращение секрета может помочь смягчить атаки по сторонним каналам.

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

  • тривиально, увеличить размер зашифрованного текста.
  • или/и рискнуть создать пользовательскую кривую с битовым размером $n$ и $р$ на несколько бит меньше, чем 256. За каждый 1 бит безопасности, от которого мы отказываемся, мы получаем примерно 2 за $n$ и $р$, таким образом, на битах зашифрованного текста или в 4 раза меньше догадок в цикле while. А для secp256r1 самые известные атаки, возможно, требуют $>2^{140}$ битовые операции (на основе консервативной экстраполяции аналогичного требовать из $>2^{140}$ для Ed25519).

Примечание. В учебнике Диффи-Хеллмана или Эль-Гамаля мы выбираем $к$ равномерно в $[0,n)$. Наш вариант ограничивается $к$ с $к\,G$ наличие $х$ согласовывать с его младшим порядком $b$ биты в нуле. Согласно статистическому аргументу, существует около $n/2^b$ такой $к$. Мы хотели бы выбрать $к$ равномерно в этом подмножестве $[0,n)$. Самым простым было бы повторение для случайного $к$, но это имеет непомерно высокие вычислительные затраты на умножение точек $R\получает k\,G$. Экономим на этом переходя от одного кандидата $к$ к следующему с фиксированным приращением $e$, позволяя обновлять $R$ добавлением одной точки $R\получает R+F$.

Если бы мы использовали фиксированное $е=1$, то $к$ выбранный циклом while, будет иметь различимое свойство (для того, кто знает $к$): вероятность того, что $к$ выбирается пропорционально $j$ вычисляется из $к$ как самый маленький $j>0$ такой, что $k-j$ находится в подмножестве (или $к+1$ если нет такого $j$, что происходит для единичного $к$ в подмножестве). Проблема аналогична неравномерному выбору простого числа, полученному путем выбора случайной начальной точки и поиска следующего простого числа.

Выбрав любой общедоступный фиксированный $e$ не решает проблему, потому что определение $j$ может быть адаптирован к $к-е\,j$ в подмножестве. Однако, выбрав случайный секрет $e$ за каждый выбор $к$ делает. Аналогичный метод используется в генераторах случайных чисел для RSA. У меня нет ссылки, но аргумент в том, что противники не зная $e$ не знаю, что $e$ использовать для теста; они могут проверить на всех $e$ и объединяют результаты, но тогда их тест завален шумом.

Я выбрал верхнюю границу интервала $[1,2^{32})$ за $e$ так что вычисление $F\получает е\,G$ имеет предельные ожидаемые затраты по сравнению с $R\получает k\,G$. Я уверен (без доказательств или ссылок), что этого более чем достаточно, чтобы сделать предвзятость при выборе $к$ практически незаметен даже для гипотетических противников, знающих $к$; а фактические противники могли получить только $к$ через боковой канал.


Последняя мысль: мы могли бы развеять любые опасения, что критерии $R_x\equiv0\pmod{2^b}$ создает слабость, приспосабливая ее к: низкому $b$ немного $R_x$ являются некоторой функцией (имеющей приблизительно равномерное распределение) других битов $R_x$. А $b$-bit CRC подойдет. Приемник может восстановить необходимые младшие биты $R_x$ применив эту функцию.

Kostas Kryptos avatar
флаг cn
Спасибо за ответ @fgrieu, есть ли причина, по которой вы не пытаетесь повторить k в R = kG до тех пор, пока Rx = 0, и вы вводите e?
fgrieu avatar
флаг ng
@Костас Халкиас: Действительно, я не генерирую новый случайный $k$, когда $R_x\not\equiv0\pmod{2^b}$, а вместо этого шагаю $k$ на $e$. Это по соображениям производительности. Мне удается исследовать новый $R$ с добавлением одной точки, а не сложением сотен или удвоением (для умножения точки), если бы я использовал новый случайный $k$. С этой точки зрения использование $(1,G)$ вместо $(e,F)$ было бы хорошо, но это делает выбор $(k,R)$ измеримо неравномерным среди тех, у которых $R_x\equiv0\pmod {2^b}$, и использование $(e,F)$ значительно улучшает эту ситуацию.
knaccc avatar
флаг es
Пожалуйста, не могли бы вы уточнить, что означают индексы x и y, например. как в
Kostas Kryptos avatar
флаг cn
@knaccc: это и координаты точки эллиптической кривой.
Kostas Kryptos avatar
флаг cn
@fgrieu отличный ответ, можете ли вы уточнить немного подробнее (даже с некоторым справочным документом), почему (,) лучше, чем (1,) однородность? Кроме того, является ли диапазон до 2 ^ 32 идеальным, или мы могли бы получить лучшие результаты однородности, если = [1, n) (при условии, что мы можем допустить дополнительную стоимость 1 большого скаляра для точки mul)?
fgrieu avatar
флаг ng
@Костас Халкиас: я добавил примечание, объясняющее проблему, и аргумент о том, почему я думаю, что она решена с помощью $(e,F)$.
Kostas Kryptos avatar
флаг cn
@fgrieu: еще раз спасибо, PS: пластичность не является проблемой при отправке ctx как части транзакции блокчейна (все транзакции в любом случае подписываются, поэтому целостность гарантируется).

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

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