データを暗号化する

# openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_encrypt — データを暗号化する

### 説明

function openssl_encrypt(
#[\SensitiveParameter]string `$data`,
string `$cipher_algo`,
#[\SensitiveParameter]string `$passphrase`,
int `$options` = 0,
string `$iv` = "",
string `&$tag` = `null`,
string `$aad` = "",
int `$tag_length` = 16
): string|false

与えられた文字列を与えられたメソッドとパスフレーズで暗号化して、 未加工の、または base64 エンコードされた文字列を返します。

### パラメータ

`data`

  暗号化するプレーンテキストメッセージ

`cipher_algo`

  暗号メソッド。 使用可能なメソッドの一覧を取得するには、openssl_get_cipher_methods() を用います。

`passphrase`

  パスフレーズ。 期待した長さより短かった場合は、 黙って`NUL` 文字で埋められます。 期待した長さより長かった場合は、 黙って切り詰められます。

  警告

  `passphrase` は、 その名前から連想されるような安全な鍵生成機能は内包していません。 唯一行う操作は、期待する鍵長と異なる場合に `NUL` で パディングしたり、切り詰めたりするだけです。

`options`

  `OPENSSL_RAW_DATA`, `OPENSSL_ZERO_PADDING`, `OPENSSL_DONT_ZERO_PAD_KEY` とのビット OR。

`iv`

  `null` ではない初期化ベクトル。 IV が期待するものよりも短い場合は、 `NUL` 文字でパディングされ、警告が発生します。 パスフレーズが期待するものよりも長い場合は、 切り捨てられ、警告が発生します。

`tag`

  AEAD 暗号モード (GCM または CCM) を使う場合の 認証タグをリファレンスで渡します。

`aad`

  追加の認証済みデータ

`tag_length`

  認証 `tag` の長さ。 GCMモードでは、この値は 4 から 16 の間です。

### 戻り値

成功した場合暗号化された文字列、失敗した場合に `false` を返します。

### エラー / 例外

`cipher_algo` パラメータを通じて未知の暗号アルゴリズムが渡された場合、 `E_WARNING` レベルのエラーを発生します。

`iv` パラメータを通じて空値が渡された場合、 `E_WARNING` レベルのエラーを発生します。

### 変更履歴

バージョン | 説明
--- | ---
7.1.0 | `tag`、`aad` および `tag_length` パラメータが追加されました。

### 例

例1 PHP 7.1以降で、AES を GCMモードで使う例

    <?php
    //$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
    $plaintext = "message to be encrypted";
    $cipher = "aes-128-gcm";
    if (in_array($cipher, openssl_get_cipher_methods()))
    {
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
        //store $cipher, $iv, and $tag for decryption later
        $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
        echo $original_plaintext."\n";
    }
    ?>

例2 PHP 7.1 より前のバージョンで、AES を使う例

    <?php
    //$key previously generated safely, ie: openssl_random_pseudo_bytes
    $plaintext = "message to be encrypted";
    $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
    $ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

    //decrypt later....
    $c = base64_decode($ciphertext);
    $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len=32);
    $ciphertext_raw = substr($c, $ivlen+$sha2len);
    $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
    $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
    if (hash_equals($hmac, $calcmac))// timing attack safe comparison
    {
        echo $original_plaintext."\n";
    }
    ?>

### 参考

- openssl_decrypt() - データを復号する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open