# Encrypt

このフィルタは、指定した設定で任意の文字列を暗号化します。 暗号化の際に、アダプタを使用します。実際には、PHP の `Mcrypt` および `OpenSSL` 拡張モジュール用のアダプタを使用します。

これら 2 つの暗号化手法はまったく異なる方式なので、 アダプタの使用法もそれぞれ異なります。 フィルタを初期化する際に、どのアダプタを使うかを選ばなければなりません。

    // Mcrypt アダプタを使用します
    $filter1 = new Zend_Filter_Encrypt(array('adapter' => 'mcrypt'));

    // OpenSSL アダプタを使用します
    $filter2 = new Zend_Filter_Encrypt(array('adapter' => 'openssl'));

別のアダプタを設定するために `setAdapter()` を使用することもできます。また `getAdapter()` メソッドで、実際に設定されているアダプタを取得することができます。

    // Mcrypt アダプタを使用します
    $filter = new Zend_Filter_Encrypt();
    $filter->setAdapter('openssl');

`adapter` オプションを指定しなかったり setAdapter を使用しなかったりした場合は、デフォルトで `Mcrypt` アダプタを使用します。

## Mcrypt での暗号化

`Mcrypt` 拡張モジュールをインストールすると、 `Mcrypt` アダプタが使えるようになります。 このアダプタは、初期化時のオプションとして以下をサポートしています。

- key: 暗号化用の鍵。 入力を暗号化する際に使用します。 復号する際にも同じ鍵が必要です。

- algorithm: 使用するアルゴリズム。 PHP マニュアルの mcrypt のページ であげられている暗号化アルゴリズムのいずれかでなければなりません。 省略した場合のデフォルトは `blowfish` です。

- algorithm_directory: アルゴリズムが存在するディレクトリ。 省略した場合のデフォルトは、mcrypt 拡張モジュールで設定されているパスです。

- mode: 使用する暗号化モード。 PHP マニュアルの mcrypt のページ であげられているモードのいずれかでなければなりません。 省略した場合のデフォルトは `cbc` です。

- mode_directory: モードが存在するディレクトリ。 省略した場合のデフォルトは、`mcrypt` 拡張モジュールで設定されているパスです。

- vector: 使用する初期化ベクトル。 省略した場合はランダムなベクトルとなります。

- salt: キーを salt 値として使用するかどうか。 使用すると、暗号化に使用するキー自体も暗号化されます。 デフォルトは false です。

配列ではなく文字列を指定した場合は、その文字列を鍵として使用します。

初期化した後で暗号化の値を取得したり設定したりするには、それぞれ `getEncryption()` および `setEncryption()` メソッドを使用します。

mcrypt 拡張モジュールが使用できない場合は例外が発生することに注意しましょう。

また、インスタンス作成時あるいは setEncryption() をコールした際にすべての設定がチェックされることにも注意しましょう。 設定内容に問題があることを mcrypt が検知すると、例外がスローされます。

暗号化ベクトルの取得や設定には、それぞれ `getVector()` および `setVector()` を使用可能です。指定した文字列が、 そのアルゴリズムに必要なベクトルのサイズに応じて切り詰められたり伸ばされたりします。

自前のベクトル以外を使用する場合は、 そのベクトルを取得してどこかに保存しておかなければならないことに注意しましょう。 そうしないと、文字列が復号できなくなります。

    // デフォルト設定の blowfish を使用します
    $filter = new Zend_Filter_Encrypt('myencryptionkey');

    // 自前のベクトルを設定します。それ以外の場合は getVector()
    // をコールしてベクトルを保存しておかないと、後で復号できなくなります
    $filter->setVector('myvector');
    // $filter->getVector();

    $encrypted = $filter->filter('text_to_be_encoded');
    print $encrypted;

    // 復号の方法は Decrypt フィルタを参照ください

## OpenSSL での暗号化

`OpenSSL` 拡張モジュールをインストールすると、 `OpenSSL` アダプタが使えるようになります。 このアダプタは、初期化時のオプションとして以下をサポートしています。

- public: 暗号化したコンテンツを渡したい相手の公開鍵。 複数の公開鍵を指定するには、配列を使用します。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

- private: コンテンツの暗号化に使用する、あなたの秘密鍵。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

後から公開鍵を取得あるいは設定するには、`getPublicKey()` および `setPublicKey()` メソッドを使用します。 秘密鍵についても、`getPrivateKey()` および `setPrivateKey()` メソッドで取得あるいは設定することができます。

    // openssl を使用し、秘密鍵を指定します
    $filter = new Zend_Filter_Encrypt(array(
        'adapter' => 'openssl',
        'private' => '/path/to/mykey/private.pem'
    ));

    // もちろん、初期化時に公開鍵を指定することもできます
    $filter->setPublicKey(array(
        '/public/key/path/first.pem',
        '/public/key/path/second.pem'
    ));

`OpenSSL` アダプタは、正しい鍵を渡さないと動作しないことに注意しましょう。

鍵自体も暗号化したい場合は、パスフレーズを `setPassphrase()` メソッドで渡します。 パスフレーズつきで暗号化したコンテンツを復号したい場合は、 公開鍵だけではなく (暗号化された鍵を復号するための) パスフレーズも必要となります。

    // openssl を使用し、秘密鍵を指定します
    $filter = new Zend_Filter_Encrypt(array(
        'adapter' => 'openssl',
        'private' => '/path/to/mykey/private.pem'
    ));

    // もちろん、初期化時に公開鍵を指定することもできます
    $filter->setPublicKey(array(
        '/public/key/path/first.pem',
        '/public/key/path/second.pem'
    ));
    $filter->setPassphrase('mypassphrase');

最後に、OpenSSL を使用した場合に受け手に渡す必要があるものをまとめます。 暗号化されたコンテンツ、パスフレーズを使用した場合はそのパスフレーズ、 そして復号用のエンベロープ鍵。これらが必要となります。

つまり、暗号化を終えたらエンベロープ鍵を取得する必要があるということです。 取得するには `getEnvelopeKey()` メソッドを使用します。

`OpenSSL` でコンテンツの暗号化を行う完全な例は、このようになります。

    // openssl を使用し、秘密鍵を指定します
    $filter = new Zend_Filter_Encrypt(array(
        'adapter' => 'openssl',
        'private' => '/path/to/mykey/private.pem'
    ));

    // もちろん、初期化時に公開鍵を指定することもできます
    $filter->setPublicKey(array(
        '/public/key/path/first.pem',
        '/public/key/path/second.pem'
    ));
    $filter->setPassphrase('mypassphrase');

    $encrypted = $filter->filter('text_to_be_encoded');
    $envelope  = $filter->getEnvelopeKey();
    print $encrypted;

    // 復号の方法は Decrypt フィルタを参照ください