8. ファクトリによる鍵オブジェクトの生成
2006.09.12 株式会社四次元データ 里見玲爾
- 8.1. Key(鍵)とKeySpec(鍵仕様)
- 8.2. KeyFactory、SecretKeyFactoryオブジェクトの生成
- 8.3. 鍵仕様から鍵への変換
- 8.4. 鍵から鍵仕様への変換
この章ではファクトリを使った鍵オブジェクトの生成について解説します。
8.1. Key(鍵)とKeySpec(鍵仕様)
鍵のオブジェクト表現にはKeyとKeySpecの2種類あることは2章で解説しました。
KeyとKeySpecはあまり変わらない表現に見えますが、実はこの2つには明確な違いがあります。
Keyインタフェースからはその鍵のデータに直接アクセスすることができません。このためKeyは不透明な鍵表現と
呼ばれ、それに対してKeySpecは鍵のデータに直接アクセスできるため透明な鍵表現と呼ばれます。
またKeyを鍵と呼ぶのに対して、KeySpecは鍵仕様と呼ばれます。
7章のパスワードベース暗号化方式の場合、暗号化に使うパスワードは鍵(javax.crypto.interfaces.PBEKey)
から得ることはできませんが、鍵仕様(javax.crypto.spec.PBEKeySpec)からは直接得ることができます。
またすべての鍵はKeyインタフェースを継承し、すべての鍵仕様はKeySpecインタフェースを実装する必要が
あります。
Keyインタフェースで定義されているメソッドは以下の3つです。
メソッド | 解説 | 返り値 |
---|---|---|
getAlgorithm() | 鍵のアルゴリズムの名称を得るメソッド | String |
getEncoded() | 鍵の符号化形式を得るメソッド。外部転送などに使用 | byte[] |
getFormat() | 符号化した鍵のフォーマット名を得るメソッド | String |
KeySpecインタフェースではメソッドも定数も定義されていません。KeySpecは鍵仕様のグループ分けにのみ使用されます。 またKeySpecを実装したクラスではデータにアクセスするためのメソッドが定義されています。 たとえばPBEKeySpecにはパスワードを得るためのgetPasswordメソッドなどが定義されています。
この鍵と鍵仕様を変換する役割を果たすのがファクトリです。 鍵にパスワードなどのデータを持たせる場合、通常は鍵仕様にデータを渡した後でファクトリオブジェクトで 鍵に変換する方法をとります。 公開鍵、非公開鍵に変換するファクトリはjava.security.KeyFactory、共通鍵に変換するファクトリはjavax.crypto.SecretKeyFactoryです。 次節からは、このファクトリについて解説します。
8.2. KeyFactory、SecretKeyFactoryオブジェクトの生成
KeyFactoryとSecretKeyFactoryオブジェクトの生成にはKeyGenerator同様、ファクトリメソッドである下のgetInstanceメソッドを 使います。
static KeyFactory getInstance(String Algorithm); static KeyFactory getInstance(String Algorithm, String provider); static KeyFactory getInstance(String Algorithm, Provider provider); static SecretKeyFactory getInstance(String Algorithm); static SecretKeyFactory getInstance(String Algorithm, String provider); static SecretKeyFactory getInstance(String Algorithm, Provider provider);
8.3. 鍵仕様から鍵への変換
鍵仕様から鍵に変換するときはそれぞれgeneratePublic、generatePrivate、generateSecretメソッドを実行します。
PublicKey generatePublic(KeySpec keyspec); PrivateKey generatePrivate(KeySpec keyspec); SecretKey generateSecret(KeySpec keyspec);
8.4. 鍵から鍵仕様への変換
逆に鍵から鍵仕様に変換するときにはどれも下のgetKeySpecメソッドを実行します。
KeySpec getKeySpec(Key key, Class keySpec);
keySpecには返されるべき鍵仕様クラスを渡します。たとえばDSAアルゴリズムのPublicKeyを鍵仕様に変換する場合、 返されるべき鍵仕様クラスはjava.security.spec.DSAPublicKeySpecなのでそれを渡します。