Перейти к основному содержимому

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

· 2 мин. чтения

1. Обзор

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

2. Класс шифрования

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

3. Список алгоритмов шифрования

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

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

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

Во- первых, нам нужно получить список зарегистрированных провайдеров с помощью метода Security.getProviders() . Затем вызов метода getServices() для объекта 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<String> 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 .