1. 概要

このクイックチュートリアルでは、JavaのCipherクラスについて学習します。 次に、利用可能な暗号アルゴリズムとそのプロバイダーを一覧表示する方法を説明します。

2. 暗号クラス

javax.cryptoパッケージにあるCipherクラスは、Java Cryptography Extension(JCE)フレームワークのコアです。 このフレームワークは、データの暗号化、復号化、およびハッシュのための一連の暗号化暗号を提供します。

3. 暗号アルゴリズムの一覧表示

要求された変換の名前を引数としてCipher.getInstance()静的メソッドを呼び出すことにより、暗号オブジェクトをインスタンス化できます。

Cipher cipher = Cipher.getInstance("AES");

利用可能な暗号アルゴリズムとそのプロバイダーのリストを取得する必要がある場合があります。 たとえば、クラスパスに存在するライブラリに基づいて、特定のアルゴリズムが使用可能かどうかを確認したいとします。

まず、Security.getProviders()メソッドを使用して、登録済みプロバイダーのリストを取得する必要があります。 次に、ProviderオブジェクトでgetServices()メソッドを呼び出すと、この Provider でサポートされているすべてのサービスの変更不可能なセットが返されます。

for (Provider provider : Security.getProviders()) {
    for (Provider.Service service : provider.getServices()) {
        String algorithm = service.getAlgorithm();
        // ...
    }
}

利用可能なアルゴリズムのリスト:

SHA3-224
NONEwithDSA
DSA
JavaLoginConfig
DSA
SHA3-384
SHA3-256
SHA1withDSA
...

ただし、リストされているすべてのアルゴリズムが であり、Cipher.getInstance()静的メソッドによる変換としてサポートされているわけではありません。 たとえば、ハッシュアルゴリズムである SHA3-224 を使用して暗号オブジェクトをインスタンス化すると、 NoSuchAlgorithmException:がスローされます。

Cipher cipher = Cipher.getInstance("SHA3-224");

実行時例外メッセージを見てみましょう。

java.security.NoSuchAlgorithmException: Cannot find any provider supporting SHA3-224

したがって、リストをフィルタリングし、暗号タイプでサービスを維持する必要があります。 Javaストリームを使用して、互換性のあるアルゴリズムの名前のリストをフィルタリングおよび収集できます。

List<String> algorithms = Arrays.stream(Security.getProviders())
  .flatMap(provider -> provider.getServices().stream())
  .filter(service -> "Cipher".equals(service.getType()))
  .map(Provider.Service::getAlgorithm)
  .collect(Collectors.toList());
// ...

結果は次のようになります。

AES_192/CBC/NoPadding
AES_192/OFB/NoPadding
AES_192/CFB/NoPadding
AESWrap_192
PBEWithHmacSHA224AndAES_256
AES_192/ECB/NoPadding
AES_192/GCM/NoPadding
ChaCha20-Poly1305
PBEWithHmacSHA384AndAES_128
AES_128/ECB/NoPadding
AES_128/OFB/NoPadding
AES_128/CBC/NoPadding
...

4. 結論

このチュートリアルでは、最初にCipherクラスについて学びました。 次に、利用可能な暗号アルゴリズムを一覧表示する方法を学びました。

いつものように、すべての例はGitHubから入手できます。