5. Cipherクラス(1)
2006.05.30 株式会社四次元データ 里見玲爾
- 5.1. Cipherオブジェクトの生成
- 5.2. Cipherオブジェクトの初期化
Cipherオブジェクトは、鍵やアルゴリズムパラメータの情報を受け取って暗号化を行います。 この章では、Cipherオブジェクトの生成、初期化について解説します。
5.1. Cipherオブジェクトの生成
Cipherオブジェクトの生成には、これまでと同様に下のgetInstanceファクトリメソッドを実行します。
static Cipher getInstance(String transformation); static Cipher getInstance(String transformation, String provider); static Cipher getInstance(String transformation, Provider provider);
transformationには、暗号化に使用するアルゴリズムやフィードバックモードおよびパディング方式を次の形で 指定します。フィードバックモードとは、ブロック暗号化を行う際に各ブロックをどのように暗号化するかを 指定するものです。
algorithm/mode/padding 例: String transformation = "DES/CBC/PKCS5Padding"; String transformation = "DES";
2つめの例のようにフィードバックモードやパディングを指定しない場合はプロバイダ固有のデフォルト値が使われます。 SunJCEプロバイダの場合DESのデフォルトモードはECB、デフォルトパディング方式はPKCS5Paddingとなっていて、 3章の例ではこのモードとパディングを利用して暗号化を行ったことになります。
SunJCE標準プロバイダに実装されている暗号化アルゴリズムには以下のようなものがあります。
アルゴリズムの種類 | 暗号化アルゴリズム | 解説 |
---|---|---|
共通鍵暗号 | DES | 64ビットずつ区切る共通鍵ブロック暗号。鍵長は56ビットで、近年暗号強度が低下している |
DESede | DESを3重に行う共通鍵暗号。TripleDESという暗号化の方法のひとつ | |
AES | DESにかわり新しく策定された共通鍵128ビットブロック暗号。鍵長は128、192、256ビットを サポート。もとはRijndaelというアルゴリズム | |
Blowfish | Bruce Schneier氏が開発した共通鍵64ビットブロック暗号。32から448ビットまでの 可変長の鍵を用いる。特許を持たない | |
PBEWith<D>And<E> | パスワードベースと呼ばれる共通鍵暗号。共通鍵の情報として パスワードを用いる。<D>は暗号化の中で使う メッセージダイジェストアルゴリズムで(MD5、SHA1など)、<E>は利用する共通鍵アルゴリズム (ここではDES、DESede) | |
RC2 | Ron Rivestが開発した共通鍵64ビットブロック暗号。鍵は可変長 | |
RC4 | Ron Rivestが開発したストリーム暗号。鍵は可変長 | |
RC5 | Ron Rivestが開発した共通鍵可変ブロック暗号(32、64、128ビットをサポート)。 鍵は可変長 | |
ARCFOUR/RC4 | RC4を元に開発されたストリーム暗号 | |
公開鍵暗号 | RSA | 素因数分解を利用した公開鍵暗号 |
ECIES | 対数離散と楕円曲線を利用した公開鍵暗号 |
SunJCEに実装されているだけでもこれだけあるのですが、これだけでは強度の違いがよくわかりません。 一般的には鍵長が長いほど鍵を特定しにくいため暗号強度が強いと言えそうです(RC2は特定の鍵を使用すると 法則性が見えやすくなり解読されやすいことが知られているため鍵長がすべてではありませんが)。 AESなどの近年のアルゴリズムは128ビットの鍵長をサポートしており総当り解読法(コンピュータに鍵を次々に試させる方法) では計算に何年もかかるようになったため、強度はDESなどに比べてかなり強くなったといえます。
主なフィードバックモードとパディング方式を以下に示します。
フィードバックモード | 解説 |
---|---|
ECB(Electronic Code Block) | 各ブロックを別々に暗号化します。しかしこの方法ではブロックを比較することで鍵を推測することが簡単なため、 とても弱い暗号になります。 |
CBC(Cipher Block Chaining) | あるブロックBを暗号化する前に、 その1つ前のブロックAの暗号テキストとブロックBのテキストの排他的論理和をとり、 そのあと暗号鍵による暗号化を行ってブロックBの暗号テキストを得ます。 また最初のブロックは、適当に定めた初期値との排他的論理和をとリます。 初期値暗号テキストがその前に暗号化されたブロックすべてに依存した結果となり、推測が困難になります。 |
CFB(Cipher Feedback) | あるブロックAの暗号テキストを暗号鍵により暗号化し、 それと次のブロックBのテキストとの排他的論理和をとった結果をブロックBの暗号テキストとします。 最初のブロックは適当に定めた初期値を暗号化します。CBCとよく似ていて、暗号化と排他的論理和をとるタイミングが 逆になっています。 |
OFB(Output Feedback) | 適当に定めた初期値Xを暗号化した暗号鍵で暗号テキストX1と1つ目のブロックAの排他的論理和をAの暗号テキストとし、 X1をさらに暗号化したテキストX2と2つ目のブロックBの排他的論理和をBの暗号テキストとし・・・というように、 ブロックが変わるごとに初期値を何度も暗号化するモードです。 |
パディング方式 | 解説 |
---|---|
PKCS5Padding | PKCS#5 バージョン1.5で定義されているパディング方式 |
ISO10126Padding | W3Cの「XML Encryption Syntax and Processing」文書の "5.2.Block Encryption Algorithms"で規定されたパディング方式 |
SSL3Padding | SSL Protocol バージョン 3.0の5.2.3.2(CBC ブロック暗号)で規定された パディング方式 |
5.2. Cipherオブジェクトの初期化
Cipherオブジェクトを初期化するときに、そのオブジェクトを何の目的で使用するかを指定する必要があります。 引数に以下のどれかを渡すことで指定します。
暗号化のモード | 解説 | 初期化時に渡す定数(static final int) |
---|---|---|
暗号化モード | テキストを暗号化する際に指定するモードです | ENCRYPT_MODE |
復号化モード | テキストを復号化する際に指定するモードです。 | DECRYPT_MODE |
ラップモード | ある鍵を符号化形式に暗号化(ラップ)する際に指定するモードです | WRAP_MODE |
アンラップモード | ある鍵に関する符号化形式を復号化(アンラップ)する際に指定するモードです | UNWRAP_MODE |
Cipherオブジェクトはテキストを暗号化したり復号化する他に、鍵に対する暗号化(ラップ)や復号化(アンラップ)にも
使用できます。
Cipherオブジェクトの初期化には下のinitメソッドを使用し、引数には上の暗号化のモードとそれに使用する鍵、
アルゴリズムパラメータなどを指定します。SecureRandomは乱数の発生源を提供するクラスで、もし指定しない場合は
プロバイダ固有のデフォルト値が使われます。
void init(int mode, Key key); void init(int mode, Key key, AlgorithmParameters param); void init(int mode, Key key, AlgorithmParameterSpec params); void init(int mode, Key key, AlgorithmParameters param, SecureRandom random); void init(int mode, Key key, AlgorithmParameterSpec params, SecureRandom random); void init(int mode, Key key, SecureRandom random);
アルゴリズムパラメータを必要とするアルゴリズムで暗号化する場合は2、3、4、5番目のいずれかで初期化します
(ただしプロバイダがデフォルト値を与える場合はそうでなくともよい)。
復号化モード、アンラップモードでのCipherの初期化には、アルゴリズムパラメータを必要とするアルゴリズムならば
必ず2、3、4、5番目のメソッドで初期化する必要があります。
Cipherオブジェクトを初期化すると、それまで持っていた情報をすべて失うことになります。
たとえば暗号化を行ったあとのCipherオブジェクトを復号化に使うために初期化した場合、
暗号化を行ったときの情報はすべて失っていることになります。