Какой отступ используется javax.crypto.Cipher для RSA
Мне нужно расшифровать сообщения через RSA, чтобы отправить их по незащищенному каналу, но я боюсь атаки Oracle Padding. Поэтому я уже задал следующие вопросы:
- Как проверить целостность зашифрованных сообщений RSA?
- Как обеспечить целостность сообщений для шифров 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");
Это не очень хороший совет, приведенный в первой ссылке на сайт криптографии. Вы никогда не должны полагаться на значения по умолчанию криптографических алгоритмов криптографических библиотек. Есть много причин для этого:
- Разные реализации, разные настройки по умолчанию (для провайдеров криптографии нет никаких требований относительно настроек по умолчанию, хотя большинство из них будут копировать значения по умолчанию Oracle/Sun);
- То, что сейчас безопасно, не может считаться безопасным завтра, и потому что для обратной совместимости вы никогда не сможете изменить значение по умолчанию;
- Никому, кто читает вашу программу, непонятно, какое значение по умолчанию (вы могли бы это задокументировать, но в этом случае вы могли бы также написать это).
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
также.