Рейтинг:0

Безопасная реализация слепых подписей RSA

флаг in

Примечание: я не криптограф

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

Этап выдачи подписи

  1. Получить открытый ключ; экспонента $е$, модуль $n$
  2. Сгенерировать случайное число $г$ который меньше и взаимно прост с модулем $n$
  3. Рассчитать хеш приватного токена $м$
  4. Рассчитать ослепленное сообщение $ M = h(m).(r^emod$ $n) $
  5. Отправьте слепое сообщение на сервер, который вернет слепую подпись. $S = M^d мод $ $n$, куда $д$ является частным показателем
  6. Рассчитать неслепую подпись $s = S.r^{-1}$

Если я прав, это закончится приватным токеном $м$ и его действительная подпись $s$

Вопрос 1: Как умножить $ч(м)$ и $r^emod$ $n$ ? Не будет результат больше, чем $n$ ?
вопрос 2: Могу ли я просто использовать любой хеш-алгоритм на $м$ как SHA-256?
Вопрос 3: сервер не будет хешировать или дополнять слепое сообщение перед его подписью. Это правильно и безопасно?

Этап проверки подписи

  1. Клиент отправляет свой закрытый токен $м$ и его подпись $s$
  2. Сервер проверит подпись $s^e = ч(м)$ $мод$ $n$

Вопрос 4: Как реализовать схему заполнения, чтобы предотвратить подделку подписи из-за гомоморфного свойства RSA?
Вопрос 5: Уязвима ли эта реализация для каких-либо атак? Есть улучшения?

fgrieu avatar
флаг ng
Уравнение для $M$ имеет вид $ M = h(m).(r^emod$ $n) $ в вопросе. Я думаю, что с хорошей типографикой это дает $M=h(m)\cdot(r^e\bmod n)$. Но так ли это? Разве это не $M=h(m)\cdot r^e\bmod n$ ? Это можно вычислить как $M=(h(m)\cdot (r^e\bmod n))\bmod n$. Кроме того, я почти уверен, что имелось в виду $s = S\cdot r^{-1}\bmod n$, где есть $s = S.r^{-1}$, а правильный типографика - $S=M^d \bмод п$.
Рейтинг:2
флаг my

примечание: я не криптограф

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

Извините, но когда я слышу подобные вопросы, это звучит так:

Я не хирург, но я хочу сделать операцию на сердце. Я провел много исследований в течение нескольких дней, и я хочу убедиться, что понимаю основы, прежде чем начать...

Хорошо, я бы не что плохо, но звучит несколько похоже (и если это действительно для «приложения на стадии производства», это может быть не так уж и далеко. По крайней мере, если вы ошибетесь при операции на сердце, вы сразу узнаете об этом). это не сработало...

С этим от моей груди, вот несколько ответов:

Вопрос 1: Как умножить $ч(м)$ и $r^e \bmod n$ ? Не будет результат больше, чем $n$ ?

На самом деле, вы умножаете их по модулю $n$.

Вопрос 2: Могу ли я просто использовать любой хеш-алгоритм на m, например SHA-256? Вопрос 4: Как реализовать схему заполнения, чтобы предотвратить подделку подписи из-за гомоморфного свойства RSA?

Я беру эти два вопроса вместе, потому что у них один и тот же ответ. Какие $ч$ должен быть не прямой SHA-256, а тот, в котором вы выполняете хеширование (например, SHA-256), а затем дополняете результат, используя, возможно, PKCS 1.5 SSA или PSS (в зависимости от того, что ожидает верификатор).

Вопрос 3: Сервер не будет хешировать или дополнять слепое сообщение перед его подписью. Это правильно и безопасно?

В данном случае это правильно и безопасно — если бы сервер либо хэшировал, либо дополнял сообщение, это все бы испортило. Помните, вы сделали хеширование/заполнение на шаге 4.

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

Mohamed Waleed avatar
флаг in
Спасибо за ваш ответ, я не хотел реализовывать это сам, так как я не криптограф, но я не нашел никакой реализации, которую можно было бы безопасно использовать. Поэтому я спросил о деталях реализации, а затем напишу код для ее выполнения.Я хочу убедиться в последнем: чтобы проверить правильность заполнения подписи, я попытаюсь дополнить исходное сообщение и проверить, равны ли результаты (например, проверка хэша сообщения). то есть pad(m) = s. Это правильно ?

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

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