Рейтинг:3

Есть ли простой способ сделать учебник RSA достаточно безопасным, чтобы его можно было использовать в реальной жизни?

флаг cn

Я написал сырую (учебную) реализацию RSA (просто для развлечения), и мне интересно, есть ли простой способ сделать ее достаточно безопасной, чтобы ее можно было использовать в реальной жизни (без реализации OAEP+ и RSASSA-PSS)? Существуют ли простые алгоритмы заполнения и создания безопасных цифровых подписей?

kelalaka avatar
флаг in
И [Схема подписи PKCS1-v1_5] (https://crypto.stackexchange.com/a/88101/18298) имеет доказательство _from с доказуемой точки зрения безопасности можно безопасно использовать RSA PKCS#1 v1.5, если выходная длина хэша функция выбрана правильно_
Brongs Gaming avatar
флаг cn
Спасибо за ответ, @kelalaka!
Рейтинг:7
флаг my

На самом деле заполнение подписи RSASSA-PKCS1-v1_5 довольно простое и не имеет известных слабых мест (заполнение с аналогичным названием RSAES-PKCS1-v1_5 нарушается для шифрования, если только оно не реализовано очень осторожно; не используйте его).

Формат заполнения:

00 01 FF FF FF ... FF FF 00 <МЭД типа хэша> <хэш>

куда DER типа хэша это строка байтов, которая зависит от типа используемого вами хэша, и Хэш является выходом хеш-функции. Для SHA-256 DER — это строка байтов:

30 31 30 0д 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

Итак, вы берете свой хеш, добавляете к нему фиксированную строку, и все готово.

Если вы хотите немного упростить задачу, вы можете опустить DER типа хэша (что означало бы, что вы не совсем PKCS # 1.5, однако это не вносит никаких известных недостатков.

Brongs Gaming avatar
флаг cn
Спасибо за ответ! Правильно ли я понял, что RSASSA-PKCS1-v1_5 можно использовать только для генерации ЭЦП?
SAI Peregrinus avatar
флаг si
Да, это только для подписи. Шифрование RSA в основном полезно в качестве строительного блока для других конструкций (например, гомоморфного шифрования). Простой альтернативой может быть RSA-KEM, который не совсем шифруется (он обменивается случайным числом, которое используется для получения ключа шифрования для использования с симметричным AEAD), но является простым и безопасным.
poncho avatar
флаг my
@BrongsGaming: ну, да, однако вопрос был задан: «Существуют ли какие-либо простые алгоритмы для заполнения и создания безопасных цифровых подписей?» - вы не просили простых алгоритмов для шифрования. Для этого самым простым может быть «вообще не делать заполнение; вместо этого пусть шифровальщик выбирает случайное значение между 2 и $ n-2 $ и зашифровывает его по учебнику RSA; используйте исходное случайное число, которое вы выбрали, чтобы сгенерировать симметричный ключ и используйте этот симметричный ключ для шифрования сообщения, которое вы хотите отправить.
SAI Peregrinus avatar
флаг si
Следует отметить, что RSA-KEM, по сути, является более формальной версией этого (он указывает, как использовать случайное число для генерации симметричного ключа, и несколько других битов о формате).
Brongs Gaming avatar
флаг cn
Спасибо @SAI Peregrinus и @poncho! Извините, что мой вопрос не ясен. Я новичок в этом деле и английский не мой родной язык. :)
Brongs Gaming avatar
флаг cn
@poncho, но как я могу безопасно передать это случайное число, если учебник RSA считается небезопасным?
poncho avatar
флаг my
@BrongsGaming: причина, по которой учебник RSA считается небезопасным, заключается в следующем: а) потому что он детерменист; злоумышленник может угадывать открытые тексты и шифровать их - если они угадывают правильно, он знает открытый текст и б) гомоморфные свойства RSA; если зашифрованное значение является гладким числом, то есть произведением небольших простых чисел, злоумышленник может удивительно быстро восстановить этот открытый текст. Ни один из них не применим к RSA-KEM (где вы выбираете случайное n-битное число)
poncho avatar
флаг my
@Gilles: на самом деле RSASSA-PKCS1-v1_5 — это формат заполнения подписи (и его нельзя использовать для шифрования, поскольку он детерминирован). Вы думаете о RSAES-PKCS1-v1_5; это слабо, однако я описываю формат заполнения RSASSA достаточно подробно, чтобы не было никакой путаницы
Gilles 'SO- stop being evil' avatar
флаг cn
Ах, извините, я слишком упростил предложение. Я действительно думаю, что важно настаивать на том, что подходит только подпись PKCS1v1.5, а не шифрование PKCS1v1.5.
Рейтинг:6
флаг in

Также существует более простая, но малоизвестная схема подписи для RSA;

Он практически не поддается подделке при адаптивных атаках с выбранным сообщением в модели случайного оракула.

Сегодня RSA-FDH очень прост;

  • Подписать: $\sigma = Sign(H, m) = (H(m))^d \bmod n$
  • Проверять: $\{0,1\} = Verify(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$

Подписать тогда было непросто из-за требований к размеру; хэш $Ч$ должен иметь выходной размер, равный размеру модуля RSA. Теперь очевидным выбором является eИксчувствительный Овывод Фсоюзы (XOF) как Встряхнуть128/встряхнуть256 ША-3.

Запросите выходной размер от SHAKE128 (или SHAKE256), равный размеру модуля RSA, хешируйте его, затем подпишите, вот и все!


импортировать хеш-библиотеку
импортировать rsa

(pubkey, privkey) = rsa.newkeys(2048)


FHD = hashlib.shake_128()
FHD.update(b'Сообщение для подписи')
дайджестFDH = int.from_bytes(FHD.digest(255),byteorder='little')

#просто m^d mod n    
подписанный = rsa.core.decrypt_int (digestFDH, privkey.d, pubkey.n)

#просто м^е мод н
если дайджестFDH == rsa.core.encrypt_int(signed,pubkey.e,pubkey.n):
    распечатать("проверено")
еще:
    print("!!!Проверка не удалась. Остановить!!!")

Точное определение, как в статье 1998 г. (без кавычек)

Алгоритм подписи и проверки имеет доступ к оракулу к хеш-функции $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. Генерация и проверка подписи выполняются следующим образом:

$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{return}y^d \bmod N$

$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$ $\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{if }y = y' \text{ then return }1 \text{ else return } 0$

и обратите внимание, что, по крайней мере, некоторые из элементов $\mathbb{Z}_N^*$ не может быть выведен стандартным XOF. Модуль не является точной степенью числа 2, поэтому нужно выводить на один бит меньше, чем модуль. Библиотека, которую я использовал для примера реализации, использует байты для размера вывода, поэтому она не может охватывать до 8 бит.

Кроме того, исключается вывод всех нулей!.

Brongs Gaming avatar
флаг cn
Спасибо за ответ! Интересная идея. Но где вы запросили, чтобы размер вывода от Shake128 был равен размеру модуля RSA в этом фрагменте кода?
kelalaka avatar
флаг in
`digest(255)`, и обратите внимание, что я не утверждаю, что это безопасная реализация, особенно против побочных каналов, [немного информации] (https://crypto.stackexchange.com/q/75408/18298). Возможно, вам придется использовать безопасный. См. [предупреждение библиотеки] (https://pypi.org/project/rsa/)
Maarten Bodewes avatar
флаг in
Комментарии не для расширенного обсуждения; этот разговор о том, что выше **почти подпись FDH** был [перенесен в чат](https://chat.stackexchange.com/rooms/131177/discussion-on-answer-by-kelalaka-is- есть-легкий-способ-создать-учебник-rsa-secure).
флаг kr
Это не лучшие оценки из «Оптимальных доказательств безопасности для хэша полного домена». Revisited» Какви и Килца?
kelalaka avatar
флаг in
@Ruggero Кажется, я пропустил это. Спасибо, обновлю после прочтения...
Рейтинг:2
флаг vu

Другие ответы дали хороший обзор схем подписи RSA с простыми дополнениями, которые можно безопасно использовать.

Я хотел бы обратить внимание читателей на схему шифрования «RSA-KEM» (поскольку этот вопрос также помечен как OAEP), указанную в стандартном RFC (в котором указывается ее использование в CMS в средах синтаксиса криптографических сообщений).

https://datatracker.ietf.org/doc/html/rfc5990#appendix-A

По сути, это как часть шифрования для «полного хэша домена», где ключевой материал, зашифрованный алгоритмом RSA, является «полным доменом», то есть это значение, выбранное равномерно случайным образом в диапазоне $[0,N)$ куда $N$ является общественным модулем.

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

Brongs Gaming avatar
флаг cn
Спасибо за ответ!

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

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