【PHP8.x】openssl_encrypt関数の使い方

作成日: 更新日:

openssl_encrypt関数は、OpenSSLライブラリを使用してデータを暗号化する関数です。指定された暗号化メソッド、キー、および初期化ベクトル(IV)に基づいて、平文データを暗号文に変換します。この関数は、セキュリティが重要なアプリケーションにおいて、データの機密性を保護するために広く利用されます。

openssl_encrypt関数を使用するには、暗号化したいデータ(平文)、使用する暗号化アルゴリズム(例:AES、DES)、暗号化キー、および必要に応じて初期化ベクトル(IV)を指定する必要があります。初期化ベクトルは、同じキーを使用して同じ平文を複数回暗号化する場合でも、異なる暗号文を生成するために使用されます。これにより、セキュリティが向上します。

関数は、暗号化されたデータを文字列として返します。エラーが発生した場合、例えば、無効な暗号化メソッドが指定された場合や、キーの長さが正しくない場合などには、falseを返します。

openssl_encrypt関数を使用する際には、以下の点に注意する必要があります。

  • 暗号化アルゴリズムは、セキュリティ要件に合わせて適切に選択する必要があります。
  • キーは十分に長く、安全に管理する必要があります。
  • 初期化ベクトル(IV)は、暗号化ごとにランダムに生成することが推奨されます。
  • 暗号化されたデータは、復号化されない限り元のデータを復元できません。復号化には、暗号化に使用したキーと初期化ベクトルが必要です。

openssl_encrypt関数は、データの暗号化処理を簡単に行うことができる強力なツールですが、セキュリティ上の考慮事項を十分に理解した上で適切に使用する必要があります。

基本的な使い方

構文(syntax)

openssl_encrypt ( string $data , string $method , string $password , int $options = 0 , string $iv = "" , string &$tag = null , string $aad = "" , int $tag_length = 16 ) : string|false

引数(parameters)

string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string &$tag = null, string $aad = "", int $tag_length = 16

  • string $data: 暗号化したいデータ。
  • string $cipher_algo: 使用する暗号化アルゴリズムの名前。
  • string $passphrase: 暗号化/復号に使用するパスフレーズ。
  • int $options = 0: 暗号化のオプションを指定する整数。
  • string $iv = "": 初期化ベクトル (Initialization Vector)。
  • string &$tag = null: 認証タグ。復号時に使用。
  • string $aad = "": 追加認証データ (Additional Associated Data)。
  • int $tag_length = 16: 認証タグの長さ。

戻り値(return)

string|false

指定された方法でデータを暗号化した結果を文字列で返します。処理に失敗した場合は false を返します。

サンプルコード

PHPでAES-256-CBC暗号化する

<?php

/**
 * AES-256-CBC でデータを暗号化するサンプルコード
 *
 * @param string $data 暗号化するデータ
 * @param string $passphrase 暗号化に使用するパスフレーズ
 * @return string|false 暗号化されたデータ、またはエラー時に false
 */
function encryptData(string $data, string $passphrase): string|false
{
    $cipher_algo = 'aes-256-cbc'; // 暗号化アルゴリズム
    $ivlen = openssl_cipher_iv_length($cipher_algo); // IV の長さを取得
    $iv = openssl_random_pseudo_bytes($ivlen); // IV を生成

    $encrypted = openssl_encrypt(
        $data,
        $cipher_algo,
        $passphrase,
        OPENSSL_RAW_DATA,
        $iv
    );

    if ($encrypted === false) {
        return false; // 暗号化に失敗した場合
    }

    // IV を先頭に追加して、復号時に利用できるようにする
    $ciphertext_raw = $iv . $encrypted;
    $hmac = hash_hmac('sha256', $ciphertext_raw, $passphrase, true);

    // HMAC を付加
    $ciphertext = base64_encode($ciphertext_raw . $hmac);

    return $ciphertext;
}

// 利用例
$data = "This is a secret message.";
$passphrase = "my_secret_passphrase";

$encrypted_data = encryptData($data, $passphrase);

if ($encrypted_data !== false) {
    echo "Encrypted data: " . $encrypted_data . PHP_EOL;
} else {
    echo "Encryption failed." . PHP_EOL;
}

このサンプルコードは、PHPのopenssl_encrypt関数を使用して、AES-256-CBCアルゴリズムでデータを暗号化する方法を示しています。openssl_encrypt関数は、指定された暗号化アルゴリズム、パスフレーズ、および初期化ベクトル(IV)を使用して、データ文字列を暗号化します。

encryptData関数は、暗号化するデータ $data とパスフレーズ $passphrase を引数として受け取ります。まず、使用する暗号化アルゴリズム $cipher_algoaes-256-cbc に設定し、openssl_cipher_iv_length関数でIVの長さを取得します。次に、openssl_random_pseudo_bytes関数を使用してランダムなIVを生成します。

openssl_encrypt関数を呼び出す際、OPENSSL_RAW_DATAオプションを指定することで、暗号化されたデータをバイナリ形式で取得します。暗号化に失敗した場合は false を返します。成功した場合、生成したIVを暗号化されたデータの先頭に追加し、復号時に利用できるようにします。さらに、HMAC(Hash-based Message Authentication Code)を計算し、暗号化されたデータに付加することで、データの改ざんを検知できるようにしています。最後に、base64_encode関数でエンコードして、暗号化されたデータを返します。

サンプルコードでは、"This is a secret message."という文字列を、"my_secret_passphrase"というパスフレーズで暗号化する例を示しています。暗号化が成功した場合、暗号化されたデータが出力されます。失敗した場合は、"Encryption failed."と表示されます。戻り値は、暗号化された文字列または false です。

openssl_encrypt関数を利用する際の注意点です。まず、パスフレーズは十分に長く、複雑なものを使用してください。短いパスフレーズは解読されやすくなります。openssl_random_pseudo_bytesで生成されるIV(初期化ベクトル)は、暗号化ごとに異なる値を生成する必要があります。IVは暗号化されたデータとセットで安全に保管し、復号時に利用します。サンプルコードでは、IVを暗号化データの先頭に付加しています。また、暗号化だけでなく、HMAC(Hash-based Message Authentication Code)を付加することで、データの改ざんを検知できるようにしています。OPENSSL_RAW_DATAオプションは、暗号化されたデータをバイナリ形式で返すために指定しています。base64_encodeは、バイナリデータをテキスト形式に変換するために使用します。エラー処理を必ず行い、暗号化が失敗した場合の処理を記述してください。

PHP openssl_encryptでBlowfish暗号化する

<?php

/**
 * 指定されたデータをBlowfish CBCモードで暗号化します。
 * 暗号化されたデータと初期化ベクトル (IV) はBase64エンコードされ、
 * IVが暗号化データに連結された形式で返されます。
 *
 * @param string $data 暗号化する平文データ。
 * @param string $passphrase 暗号化に使用する秘密鍵(パスフレーズ)。
 * @return string|false 暗号化されたBase64エンコード文字列、または失敗した場合は false。
 */
function encryptDataBlowfish(string $data, string $passphrase): string|false
{
    $cipher_algo = 'bf-cbc'; // Blowfish CBCモードを指定

    // IV (Initialization Vector) の長さを取得
    $iv_length = openssl_cipher_iv_length($cipher_algo);
    if ($iv_length === false) {
        return false; // IV長取得に失敗した場合
    }

    // セキュアなランダムなIVを生成
    // IVは毎回異なる値を使用し、復号化のために暗号化データと一緒に保存される必要があります。
    $iv = openssl_random_pseudo_bytes($iv_length);
    if ($iv === false) {
        return false; // IV生成に失敗した場合
    }

    // openssl_encrypt を使用してデータを暗号化
    // OPENSSL_RAW_DATA オプションを指定することで、生のバイナリデータが返されます。
    // IVは引数として渡します。
    $encrypted_raw = openssl_encrypt($data, $cipher_algo, $passphrase, OPENSSL_RAW_DATA, $iv);

    if ($encrypted_raw === false) {
        return false; // 暗号化に失敗した場合
    }

    // 復号化のためにIVと暗号化された生データを結合し、全体をBase64エンコードして返します。
    // IVを先頭に結合することで、復号化時に容易に取り出せます。
    return base64_encode($iv . $encrypted_raw);
}

// --- 使用例 ---
$original_data = "これは秘密にしたいデータです。パスワードや個人情報などを想定しています。";
// 実際のアプリケーションでは、より強力でセキュアな鍵生成方法を使用してください。
$secret_key = "your_very_strong_and_secret_key_here";

// データを暗号化
$encrypted_output = encryptDataBlowfish($original_data, $secret_key);

if ($encrypted_output !== false) {
    echo "元のデータ: " . $original_data . "\n";
    echo "暗号化されたデータ (Base64エンコード): " . $encrypted_output . "\n";
} else {
    echo "データの暗号化に失敗しました。\n";
}

PHPのopenssl_encrypt関数は、指定されたデータを安全に暗号化するための重要な機能を提供します。バージョン8.4.12のextensionの一部として利用でき、データの機密性を保護する際に活用されます。

この関数は、暗号化したい元のデータ $data、使用する暗号アルゴリズム $cipher_algo(例えばBlowfishのbf-cbcなど)、そして暗号化に用いる秘密鍵 $passphrase を主な引数として受け取ります。セキュリティを確保するためには、初期化ベクトル(IV)である $iv を毎回ランダムに生成し、異なる値を使用することが非常に重要です。また、OPENSSL_RAW_DATAのような $options を指定することで、戻り値の形式を制御できます。

暗号化が成功した場合、この関数は暗号化されたデータを含む文字列を返しますが、処理に失敗した場合は false が返されます。

提供されたサンプルコードでは、bf-cbcアルゴリズムを用いてデータを暗号化するencryptDataBlowfish関数を定義しています。まずopenssl_cipher_iv_lengthでIVの適切な長さを取得し、openssl_random_pseudo_bytesでセキュアなIVを生成します。そして、このIVと秘密鍵、そしてOPENSSL_RAW_DATAオプションを指定してopenssl_encryptを実行します。最終的に、復号化に必要なIVと暗号化された生データを連結し、全体をBase64エンコードして返しています。これにより、暗号化されたデータを安全に転送・保存できるようになります。

このサンプルコードは暗号化の基本的な流れを示しますが、実運用ではセキュリティをさらに強化する必要があります。使用しているBlowfishは古い暗号アルゴリズムであり、現在ではAES-256など、より強力で推奨されるアルゴリズムの検討をお勧めします。IV(初期化ベクトル)は毎回セキュアなランダムな値を生成することが必須で、復号化のために暗号化データと共に保存する設計が不可欠です。また、パスフレーズは単純な文字列ではなく、hash_pbkdf2などの関数で安全に生成・管理するようにしてください。暗号化関数が失敗する可能性があるため、必ず戻り値をチェックし、適切にエラーハンドリングを行うことが重要です。

PHP openssl_encryptで生データを暗号化・復号化する

<?php

/**
 * データの暗号化と復号化を行うサンプル関数です。
 * openssl_encrypt 関数を使用してデータを暗号化し、openssl_decrypt 関数で復号化します。
 * OPENSSL_RAW_DATA オプションを使用し、初期化ベクトル (IV) の生成と管理も示します。
 *
 * @param string $plaintext 暗号化したい元のテキストデータ。
 * @param string $password 暗号化と復号化に使用する秘密のパスワード (鍵)。
 * @return void 結果を標準出力に表示します。
 */
function encryptAndDecryptExample(string $plaintext, string $password): void
{
    // 使用する暗号アルゴリズムを選択します。AES-256-CBCは広く使われている堅牢な選択肢です。
    $cipherAlgo = 'aes-256-cbc';

    // 選択したアルゴリズムに必要な初期化ベクトル (IV) の長さを取得します。
    // IVは暗号化ごとにユニークである必要がありますが、秘密にする必要はありません。
    // 暗号文と一緒に保存または送信する必要があります。
    $ivLength = openssl_cipher_iv_length($cipherAlgo);
    if ($ivLength === false) {
        echo "エラー: IVの長さを取得できませんでした。\n";
        return;
    }

    // 暗号学的に安全なランダムなIVを生成します。
    $iv = openssl_random_pseudo_bytes($ivLength);
    if ($iv === false) {
        echo "エラー: IVの生成に失敗しました。\n";
        return;
    }

    echo "--- 暗号化処理 ---\n";
    echo "元のプレーンテキスト: " . $plaintext . "\n";
    echo "使用するアルゴリズム: " . $cipherAlgo . "\n";
    echo "生成されたIV (Hex): " . bin2hex($iv) . "\n";

    // openssl_encrypt 関数でデータを暗号化します。
    // OPENSSL_RAW_DATA オプションは、出力がBase64エンコードされていない生データであることを指定します。
    // そのため、保存や送信のために別途Base64エンコードする必要があります。
    $encryptedRaw = openssl_encrypt(
        $plaintext,
        $cipherAlgo,
        $password,
        OPENSSL_RAW_DATA, // ここで OPENSSL_RAW_DATA オプションを使用します。
        $iv
    );

    if ($encryptedRaw === false) {
        echo "エラー: 暗号化に失敗しました。詳細: " . openssl_error_string() . "\n";
        return;
    }

    // 生の暗号化データはバイナリなので、表示や保存のためにBase64エンコードします。
    $encodedEncryptedData = base64_encode($encryptedRaw);
    echo "暗号化されたデータ (Base64): " . $encodedEncryptedData . "\n\n";

    echo "--- 復号化処理 ---\n";

    // Base64エンコードされた暗号文を元のバイナリ形式に戻します。
    $decodedEncryptedData = base64_decode($encodedEncryptedData);

    // openssl_decrypt 関数でデータを復号化します。
    // 暗号化時と同じアルゴリズム、パスワード、IV、そして OPENSSL_RAW_DATA オプションを使用する必要があります。
    $decryptedData = openssl_decrypt(
        $decodedEncryptedData,
        $cipherAlgo,
        $password,
        OPENSSL_RAW_DATA, // 暗号化時と一致させる必要があります。
        $iv
    );

    if ($decryptedData === false) {
        echo "エラー: 復号化に失敗しました。詳細: " . openssl_error_string() . "\n";
        return;
    }

    echo "復号化されたデータ: " . $decryptedData . "\n";

    // 復号化されたデータが元のプレーンテキストと一致するか確認します。
    if ($plaintext === $decryptedData) {
        echo "結果: 暗号化と復号化が成功しました!\n";
    } else {
        echo "結果: 暗号化または復号化に失敗しました!データが一致しません。\n";
    }
}

// --- サンプルコードの実行 ---
$myPlaintext = "この秘密のメッセージはシステムエンジニア初心者向けのPHP暗号化例です。";
$myPassword = "あなたの非常に強力で秘密のパスワード!これを安全に保管してください!"; // 実際のアプリケーションでは、より安全な方法で鍵を管理してください。

encryptAndDecryptExample($myPlaintext, $myPassword);

?>

PHPのopenssl_encrypt関数は、指定されたデータを強力な暗号化アルゴリズムとパスワード(鍵)を用いて安全に暗号化するために使用されます。この関数は、暗号化したいデータ本体 $data、使用する暗号化アルゴリズム $cipher_algo(例えば 'aes-256-cbc')、そして秘密のパスワード $passphrase を必須の引数として受け取ります。

特に重要なのは、暗号化のたびにユニークな初期化ベクトル(IV) $iv を提供することです。これはセキュリティを確保するために不可欠で、通常は openssl_cipher_iv_length で長さを取得し、openssl_random_pseudo_bytes で安全に生成します。IV自体は秘密にする必要はありませんが、暗号文と一緒に保存または転送する必要があります。

$options 引数には OPENSSL_RAW_DATA を指定することが一般的です。これにより、関数は生のバイナリデータとして暗号文を返します。この生データは、画面表示やテキストファイルへの保存には適さないため、base64_encode 関数などでBase64エンコードして扱う必要があります。

関数の戻り値は、暗号化に成功した場合に生のバイナリ形式の暗号化された文字列を返し、失敗した場合は false を返します。暗号化されたデータは、openssl_decrypt 関数を使用し、暗号化時と同じ $cipher_algo$passphrase$iv、そして OPENSSL_RAW_DATA オプションを用いて正確に復号化されます。これにより、元のデータが安全に復元されます。

openssl_encrypt関数でOPENSSL_RAW_DATAオプションを使用すると、出力が生のバイナリデータとなります。そのため、保存や表示、転送の際にはbase64_encodeなどで適切にエンコードし、復号化時もbase64_decodeしたデータを同じオプションと共に指定する必要があります。初期化ベクトル(IV)は暗号化ごとにopenssl_random_pseudo_bytesで安全に生成し、暗号文と一緒に管理することが非常に重要です。サンプルコードのパスワードは例示であり、実際のシステムではコードに直接埋め込まず、より安全な方法で管理してください。各関数の実行結果は必ず確認し、失敗時はopenssl_error_string()で原因を特定することが大切です。

【PHP8.x】openssl_encrypt関数の使い方 | いっしー@Webエンジニア