算法“PBE WITH MD5 AND 256 BIT AES-CBC-OPENSSL”的java.security.NoSuchAlgorithmException

时间:2012-10-17 10:23:23

标签: java android cryptography

我正在使用以下代码片段来获取指定算法的工厂实例。但它正在抛出一个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*..)

3 个答案:

答案 0 :(得分:2)

"PBEWITHMD5AND256BITAES-CBC-OPENSSL"Bouncy Castle提供程序的一部分,您可能必须下载该库才能在Java SE上使用它。不要忘记下载unlimited strength jurisdiction policy files

至于第二个例外,如果您只询问第一个提供商的第一个服务的算法,您将获得一个仅对特定类型有效的算法。在这种情况下,它仅适用于SecureRandom,而不适用于SecretKeyFactory,如果您已将.getAlgorithm()替换为.getType(),则可以使用。{/ p>

答案 1 :(得分:1)

根据SecretKeyFactory.getInstance(String algorithm)的文档:

  

algorithm - 请求的密钥算法的标准名称。请参阅“Java加密体系结构参考指南”中的附录A.

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

答案 2 :(得分:-1)

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

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

步骤2.将provider .jar文件复制到Java Runtime(JRE)extensions子文件夹;对于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的JRE);编辑文件并添加语句

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

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