Да, вы можете проходить через провайдеров и сервисы и искать сервис, который является шифром и содержит в своем имени GCM, например,
Provider[] provs = Security.getProviders();
for (Provider prov : provs) {
Set<Service> services = prov.getServices();
for (Service service : services) {
if (!service.getType().matches("(?i)Cipher")) {
break;
}
String algo = service.getAlgorithm();
if (algo.matches("(?i).*/GCM/.*")) {
System.out.println(service);
}
}
}
Остерегайтесь того, что вы можете проверить наличие неограниченного количества криптографических программ для более ранних версий Java, например, используя мой ответ здесь .
Возможно, вы захотите учесть, что GCM действителен только для 128-битных шифров и что маловероятно, что вы найдете реализации, которые не используют AES. Кроме того, нет никаких параметров, кроме "NoPadding"
, которые имеют смысл для режима GCM (в любом случае в строке алгоритма я не говорю о GCCMParameterSpec
, конечно).
Помните, что более поздние поставщики могут не возвращать "AES/GCM/NoPadding"
, а вместо этого возвращать "AES_128/GCM/NoPadding"
, "AES_192/GCM/NoPadding"
и "AES_256/GCM/NoPadding"
. Это также влияет на вызов Provider#getService(type, algorithm)
, делая его бесполезным в случае, если вы хотите проверить "AES/GCM/NoPadding"
, то есть AES с любым допустимым размером ключа.