Какой отступ используется javax.crypto.Cipher для RSA

Мне нужно расшифровать сообщения через RSA, чтобы отправить их по незащищенному каналу, но я боюсь атаки Oracle Padding. Поэтому я уже задал следующие вопросы:

  1. Как проверить целостность зашифрованных сообщений RSA?
  2. Как обеспечить целостность сообщений для шифров RSA с помощью javax.crypto.Cipher

Как предложено в первом вопросе,

Однако, поскольку вы используете высокоуровневую криптографическую библиотеку, вам не о чем беспокоиться. Авторы этой библиотеки должны были позаботиться об этом.

Я не должен думать о. Насколько я знаю, реализация RSA PKCS#1 v1.5 уязвима для Padding Oracale Attack при этом OAEP не (предполагается, что он реализован правильно)

Следовательно, я хочу знать, какая реализация заполнения используется javax.crypt.Cipher по Java 7

2 ответа

Решение

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

Cipher.getInstance("RSA")

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

Как я уже говорил ранее, по умолчанию (вероятно, есть много провайдеров, никто не может быть уверен) будет заполнение PKCS#1 v1.5. Если вам нужен другой, вам придется указать его. Если вы хотите использовать OAEP, здесь приведена полная строка шифра:

Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");

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

  1. Разные реализации, разные настройки по умолчанию (для провайдеров криптографии нет никаких требований относительно настроек по умолчанию, хотя большинство из них будут копировать значения по умолчанию Oracle/Sun);
  2. То, что сейчас безопасно, не может считаться безопасным завтра, и потому что для обратной совместимости вы никогда не сможете изменить значение по умолчанию;
  3. Никому, кто читает вашу программу, непонятно, какое значение по умолчанию (вы могли бы это задокументировать, но в этом случае вы могли бы также написать это).

SunJCEProvider по умолчанию Oracle предоставляет заполнение PKCS#1 ("PKCS1Padding") по историческим причинам (см. причину № 2 выше). Это не очень хорошо задокументировано.

В то время было установлено, что по умолчанию у вас был только небезопасный учебник RSA ("NoPadding") и версия PKCS#1 v1.5 ("PKCS1Padding" или же RSAES-PKCS1-v1_5 в стандарте PKCS#1 v2.1). В это время RSAES-PKCS1-v1_5 был определенно более безопасный выбор. Изменение значения по умолчанию сейчас на OAEP нарушило бы каждую реализацию RSA, которая использует значение по умолчанию.

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

По умолчанию для bouncy-castle, когда вы просто указываете RSA является RSA/NONE/NOPADDING

Это тот же результат, что и RSA/ECB/NOPADDING также.

Другие вопросы по тегам