Рубрики
Без рубрики

Перечисление доступных алгоритмов шифрования

Давайте посмотрим, как мы можем перечислить доступные алгоритмы шифрования.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы узнаем о классе шифров в Java. Затем мы посмотрим, как перечислить доступные алгоритмы шифрования и их поставщиков.

2. Класс Шифра

Класс Cipher , расположенный в пакете javax.crypto , является ядром фреймворка Java Cryptography Extension (JCE). Этот фреймворк предоставляет набор криптографических шифров для шифрования, дешифрования и хэширования данных.

3. Перечисление алгоритмов шифрования

Мы можем создать экземпляр объекта шифра, вызвав Cipher.getInstance() статический метод с именем запрашиваемого преобразования в качестве аргумента:

Cipher cipher = Cipher.getInstance("AES");

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

Во-первых, нам нужно получить список зарегистрированных поставщиков с помощью метода Security.getProviders () . Затем вызов метода getservice() на объекте Provider вернет неизменяемый набор всех служб, поддерживаемых этим Provider :

for (Provider provider : Security.getProviders()) {
    for (Provider.Service service : provider.getServices()) {
        String algorithm = service.getAlgorithm();
        // ...
    }
}

Список доступных алгоритмов:

SHA3-224
NONEwithDSA
DSA
JavaLoginConfig
DSA
SHA3-384
SHA3-256
SHA1withDSA
...

Однако не все перечисленные алгоритмы поддерживаются в качестве преобразования статическим методом Cipher.getInstance () . Например, создание экземпляра объекта шифра с помощью SHA3-224 , который является алгоритмом хеширования, вызовет исключение NoSuchAlgorithmException:

Cipher cipher = Cipher.getInstance("SHA3-224");

Давайте взглянем на сообщение об исключении во время выполнения:

java.security.NoSuchAlgorithmException: Cannot find any provider supporting SHA3-224

Итак, нам нужно отфильтровать список и сохранить сервисы с типом Cipher . Мы можем использовать поток Java для фильтрации и сбора списка имен совместимых алгоритмов:

List algorithms = Arrays.stream(Security.getProviders())
  .flatMap(provider -> provider.getServices().stream())
  .filter(service -> "Cipher".equals(service.getType()))
  .map(Provider.Service::getAlgorithm)
  .collect(Collectors.toList());
// ...

В результате получится что-то вроде:

AES_192/CBC/NoPadding
AES_192/OFB/NoPadding
AES_192/CFB/NoPadding
AESWrap_192
PBEWithHmacSHA224AndAES_256
AES_192/ECB/NoPadding
AES_192/GCM/NoPadding
ChaCha20-Poly1305
PBEWithHmacSHA384AndAES_128
AES_128/ECB/NoPadding
AES_128/OFB/NoPadding
AES_128/CBC/NoPadding
...

4. Заключение

В этом уроке мы впервые узнали о классе Cipher . Затем мы научились перечислять доступные алгоритмы шифрования.

Как обычно, все примеры доступны на GitHub .