Поведение Java по умолчанию в Crypto / AES - PullRequest
32 голосов
/ 07 июня 2011

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

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

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

Ответы [ 4 ]

33 голосов
/ 10 апреля 2012

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

11 голосов
/ 07 июня 2011

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

10 голосов
/ 20 марта 2013

Подробности зависят от поставщика. Справочное руководство JCA гласит:

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

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

3 голосов
/ 15 октября 2017

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

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

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

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

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

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

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

...