Javaでサポートする暗号化アルゴリズム

Java暗号化アーキテクチャ

Javaで暗号化処理を実装する場合、Java暗号化アーキテクチャ(Java Cryptography Architecture: JCA)と呼ばれるフレームワークを使います。
このフレームワークでは、使用する暗号化アルゴリズムを実行環境で変更できるようにするために、プロバイダアーキテクチャと呼ばれる仕組みになっています。Javaで提供する標準的な暗号化アルゴリズム、ベンダが独自に実装した暗号化アルゴリズムは、プロバイダと呼ばれる単位(クラスやjarファイル)で提供されます。Java実行環境の設定ファイルを変更することで、どのプロバイダのアルゴリズムを使用するかを指定することもできます。

JCAとJCE

JCAと並んでよく出てくる言葉として、Java Cryptography Extension(JCE)がある。Java8等の新し目のドキュメントを見てもちょっとピンとこない…
JCAが出た当時のドキュメントに記載がありました。

JavaTM Cryptography Architecture API Specification & Reference(2002):

The Java Cryptography Extension (JCE) extends the JCA API to include APIs for encryption, key exchange, and Message Authentication Code (MAC). Together, the JCE and the cryptography aspects of the SDK provide a complete, platform-independent cryptography API. JCE was previously an optional package (extension) to the Java 2 SDK, Standard Edition, versions 1.2.x and 1.3.x. JCE has now been integrated into the Java 2 SDK, v 1.4.
This document is both a high-level description and a specification of the Java Cryptography Architecture API and its default provider, as shipped in the Java 2 SDK. A separate document describing the JCE API is provided with the JCE release. See the “Java Security Architecture Specification” for information about the Java Security Architecture aspects of the Security API.

自分流に纏めると次の通り。

  • JCAはフレームワークであり、プロバイダアーキテクチャ等のコンセプト、暗号機能の使用や拡張を可能とするAPIを提供する。
  • JCEは、JCA APIに暗号化・鍵交換・メッセージ認証(MAC)を追加したAPI、とのこと。
  • 以前はJava(JCA API含む)とJCEは分離して提供されていたが、JDK1.4以降ではどちらもJDKに含まれている。

プロバイダの指定

使用するプロバイダはJava実行環境のプロパティファイルで指定します。

  • JDKの場合: %JAVA_HOME%\jre\lib\security\java.security
  • JREの場合: %JAVA_HOME%\lib\security\java.security

設定ファイルでプロバイダを指定する箇所は次の通りです。
プロバイダを追加する場合、そのプロバイダを開発したベンダから設定方法が公開されているはずなので、その指示に従って他の行と同様に行を追加します。
security.provider.Xの部分の番号は、アルゴリズム(実装)を探す場合の順番を意味しています。例えば、SHA-1アルゴリズムを複数のプロバイダで実装していた状況で、SHA-1を使おうとすると、番号の小さいプロバイダが提供するSHA-1アルゴリズムが使われます。

追加したプロバイダクラスが含まれるjarを次の場所に配置します。
(このフォルダは、Java拡張のためのjar群を配置するフォルダであり、暗号化以外のjarも配置されています。)

  • JDKの場合: %JAVA_HOME%\jre\lib\ext
  • JREの場合: %JAVA_HOME%\lib\ext

実行環境のプロバイダ、アルゴリズム

実行環境のプロバイダやアルゴリズムを全て列挙するサンプルは次の通りです。
プロバイダが提供する機能はサービスという単位で実装されているので、プロバイダからサービス一覧を取得し、その内容を出力しています。
サービスには型(type)が設定されており、例えばハッシュ関数(メッセージダイジェスト)の場合は、”MessageDigest”(文字列)が設定されています。

プロバイダ・アルゴリズムの例

参考として開発環境(openjdk-1.8)で実行した際の結果は次の通りです。
出力の列は、左からプロバイダ名、サービスのタイプ、アルゴリズム名です。