Подтвердить что ты не робот

Поведение Crypto/AES по умолчанию Java по умолчанию

Кто-нибудь знает, для чего используется поведение криптографического Java по умолчанию:

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");

В частности, я хочу понять, как эти классы генерируют IV, а также то, что является режимом шифрования по умолчанию при простом указании "AES". Спасибо.

4b9b3361

Ответ 1

Для Oracle JDK 7 (проверено), по умолчанию для AES используется AES/ECB/PKCS5Padding. Документация по безопасности Java не упоминает об этом, хотя (http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec), необходимо провести некоторое тестирование JUnit, чтобы узнать.

Ответ 2

Эти данные относятся к конкретным провайдерам, и использование режима по умолчанию и отступов может быть очень опасным. Если вас интересуют значения, которые поставщик данных по умолчанию использует в настоящее время в Java, вам придется искать исходный код для данного алгоритма. Например, значения по умолчанию, которые он использует для алгоритма RSA, здесь. Кроме того, в справочном руководстве Java ™ Cryptography Architecture (JCA) содержится довольно много информации, которая могла бы ответить на некоторые из вас другие вопросы.

Ответ 3

Подробная информация о конкретном поставщике. Справочное руководство JCA говорит, что:

(Создание объекта шифрования) Если не задан режим или дополнение, используются значения по умолчанию для конкретного устройства для схемы режима и дополнения. Например, поставщик SunJCE использует ECB в качестве режима по умолчанию, а PKCS5Padding - в качестве стандартной схемы дополнений для шифров DES, DES-EDE и Blowfish. Это означает, что в случае поставщика SunJCE: Cipher.getInstance( "DES" ) и Cipher.getInstance( "DES/ECB/PKCS5Padding" ) являются эквивалентными утверждениями.

Я бы всегда использовал полную форму (algorithm/mode/padding) не только потому, что считаю, что отказ от таких "деталей" реализации - это плохая практика, но и для получения зашифрованного текста, который не зависит от выбранного провайдера (обычно шифруется для хранения/передачи, тогда нельзя быть уверенным, что тот же провайдер будет использоваться позже/на другом конце).

Ответ 4

Это зависит от Провайдеров. У разных поставщиков могут быть разные параметры по умолчанию. Это ссылка для Java 8.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

Javax.crypto.Cipher.getInstance(преобразование строк) factoryметод генерирует шифры, используя преобразования формы Алгоритм/Режим/обивка. Если параметр mode/padding опущен, SunJCE и поставщики SunPKCS11 используют ECB в качестве режима по умолчанию и PKCS5Padding как по умолчанию для многих симметричных шифров.

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

Примечание. ЕЦБ хорошо работает для отдельных блоков данных и может быть распараллелен, но, как правило, не должен использоваться для нескольких блоков данных.

Поэтому вам не следует просто использовать AES, но указать режим и дополнение. Кроме того, хотя метод getInstance может иметь другой параметр для провайдера, это не рекомендуется, потому что

Приложения

привязаны к определенным провайдерам, которые могут быть недоступны на других реализациях Java