是的,您可以遍历提供者和服务,并查找一个名为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运行时的无限加密,例如使用我的答案。
here
.
您可能会认为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/不添加”
,即具有任何有效密钥大小的AES。