1

我正在使用以下代码片段来获取指定算法的工厂实例。但它正在抛出一个java.security.NoSuchAlgorithmException. 我在 jre1.6 的 java 项目中使用它。

它需要任何外部库(jar)吗?当我在我的 Android 应用程序中尝试使用相同的代码时,它运行良好。

try {
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL");
} catch (Exception e) {
    e.printStackTrace();
}

Provider[] providers = Security.getProviders();
if (null == providers) {
    System.out.println("Providers are not available.");
    return;
}

for (Provider provider : providers) {
    System.out.println("Provider: " + provider.getName());
    Set<Provider.Service> services = provider.getServices();
    for (Provider.Service service : services) {
        System.out.println("\tAlgorithm: " + service.getAlgorithm());
    }
}

try {
    SecretKeyFactory factory = SecretKeyFactory.getInstance(providers[0].getServices().iterator().next().getAlgorithm());
    if (null == factory) {
        System.out.println("Getting instance of specified algorithm failed.");
    } else {
        System.out.println("Success.");
    }
} catch (Exception e) {
    e.printStackTrace();
}

以上是编辑过的代码,并引发以下异常:

java.security.NoSuchAlgorithmException: SHA1PRNG SecretKeyFactory not available
    at javax.crypto.SecretKeyFactory.<init>(DashoA13*..)
    at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
4

3 回答 3

2

"PBEWITHMD5AND256BITAES-CBC-OPENSSL"Bouncy Castle提供程序的一部分,您可能必须下载该库才能在 Java SE 上使用它。不要忘记也下载无限强度管辖政策文件

至于第二个例外,如果你只问第一个提供者的第一个服务的算法,你会得到一个只对特定类型有效的算法。在这种情况下,它只能用于SecureRandom,而不是用于替换SecretKeyFactory为 时会发现的情况。.getAlgorithm().getType()

于 2013-01-05T01:24:47.493 回答
1

根据以下文档SecretKeyFactory.getInstance(String algorithm)

algorithm- 请求的密钥算法的标准名称。请参阅 Java Cryptography Architecture Reference Guide 中的附录 A。

因此,SecretKeyFactory.getInstance("SHA1PRNG")根据该文档,调用无效时,您应该期望并出错。

于 2012-10-17T13:20:44.530 回答
-1

执行此处的步骤。我做到了,结果是成功的。

步骤 1. 为您的 JDK 或 JRE 下载 Bouncy Castle 提供程序(JDK 1.6 的 bcprov-jdk16-146.jar);

步骤 2. 将提供程序 .jar 文件复制到 Java 运行时 (JRE) 扩展子文件夹;对于 Windows 机器,JRE 1.6(如果存在)通常安装在:例如:C:\Program Files\Java\jre6\lib\ext C:\Program Files\Java\jdk1.6.0_16\jre\lib\ext

步骤 3. 将 Bouncy Castle 提供程序添加到 java.security 文件以启用它;该文件位于 JRE 位置的 \lib\security\ 子文件夹中(注意!两个位置 - 独立 JRE 和 JDK 中的一个);编辑文件并添加语句

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider 注意:N 必须是序列中的下一个数字。

访问 --> http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

于 2013-12-28T09:51:56.140 回答