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 で使用するにはそのライブラリをダウンロードする必要がある場合があります。無制限の強度の管轄ポリシー ファイルもダウンロードすることを忘れないでください。

2 番目の例外については、最初のプロバイダーの最初のサービスのアルゴリズムを尋ねると、特定のタイプに対してのみ有効なアルゴリズムが得られます。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 に答える