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

作成日: 更新日:

openssl_decrypt関数は、OpenSSLライブラリを使用してデータを復号化する関数です。暗号化されたデータを元の平文に戻すために使用されます。この関数は、指定された暗号化方式、キー、および初期化ベクトル(IV)(必要な場合)を使用して復号化を行います。

具体的には、暗号化された文字列、使用する暗号化アルゴリズム(例:'aes-256-cbc')、復号化に使用するキー、そして必要に応じて初期化ベクトル(IV)を引数として受け取ります。初期化ベクトルは、同じキーで繰り返し暗号化を行う際に、暗号化されたデータが同じにならないようにするために使用されます。

openssl_decrypt関数は、復号化に成功した場合は元の平文データを返し、失敗した場合は false を返します。復号化が失敗する原因としては、キーが間違っている、IVが間違っている、暗号化アルゴリズムが一致しない、暗号化されたデータが破損している、などが考えられます。

システムエンジニアがこの関数を使用する際には、以下の点に注意する必要があります。

  • 暗号化に使用したアルゴリズムと全く同じアルゴリズムを復号化に使用する必要があります。
  • 暗号化に使用したキーと全く同じキーを復号化に使用する必要があります。
  • 暗号化に使用したIV(初期化ベクトル)と全く同じIVを復号化に使用する必要があります。
  • キーとIVは安全な場所に保管し、適切に管理する必要があります。
  • 復号化対象のデータが正しい形式であるか確認する必要があります。

openssl_decrypt関数を適切に使用することで、安全に暗号化されたデータを復号化し、元の情報を取得することができます。

基本的な使い方

構文(syntax)

openssl_decrypt ( string $data , string $method , string $key , int $options = 0 , string $iv = "" , string $tag = "" , string $aad = "" ) : string|false

引数(parameters)

string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string $tag = "", string $aad = ""

  • string $data: 復号化する暗号化済みのデータ
  • string $cipher_algo: 使用する暗号化アルゴリズムの名前 (例: 'aes-256-cbc')
  • string $passphrase: 復号化に使用するパスフレーズ(鍵)
  • int $options = 0: 復号化のオプションを指定する整数 (デフォルトは0)
  • string $iv = "": 初期化ベクトル。アルゴリズムによっては必要です (デフォルトは空文字列)
  • string $tag = "": 認証タグ。AEADモードで使用されます (デフォルトは空文字列)
  • string $aad = "": 追加認証データ。AEADモードで使用されます (デフォルトは空文字列)

戻り値(return)

string|false

openssl_decrypt()関数は、指定された暗号化されたデータと鍵を用いて復号処理を行います。処理が成功した場合は復号された文字列を、失敗した場合はfalseを返します。

サンプルコード

PHP openssl_decrypt エラー回避する

<?php

/**
 * openssl_decrypt の使用例とエラーハンドリング
 *
 * @param string $encryptedData 暗号化されたデータ
 * @param string $passphrase パスフレーズ
 * @param string $cipherAlgorithm 暗号化アルゴリズム (例: aes-256-cbc)
 * @param string $iv 初期化ベクトル
 *
 * @return string|null 復号化されたデータ、エラー時は null
 */
function decryptData(string $encryptedData, string $passphrase, string $cipherAlgorithm, string $iv): ?string
{
    try {
        $decrypted = openssl_decrypt(
            $encryptedData,
            $cipherAlgorithm,
            $passphrase,
            OPENSSL_RAW_DATA,
            $iv
        );

        if ($decrypted === false) {
            // openssl_decrypt が false を返した場合、エラーが発生
            $errorMessage = openssl_error_string();
            error_log("OpenSSL decryption error: " . $errorMessage);
            return null;
        }

        return $decrypted;

    } catch (Exception $e) {
        error_log("Exception during decryption: " . $e->getMessage());
        return null;
    }
}

// 使用例
$encryptedData = "your_encrypted_data_here"; // 実際の暗号化されたデータを設定
$passphrase = "your_passphrase"; // 実際のパスフレーズを設定
$cipherAlgorithm = "aes-256-cbc"; // 暗号化アルゴリズムを設定
$iv = "your_initialization_vector"; // 初期化ベクトルを設定

$decryptedData = decryptData($encryptedData, $passphrase, $cipherAlgorithm, $iv);

if ($decryptedData !== null) {
    echo "Decrypted data: " . $decryptedData . PHP_EOL;
} else {
    echo "Decryption failed." . PHP_EOL;
}

openssl_decrypt関数は、PHPで暗号化されたデータを復号化するために使用します。この関数は、暗号化された文字列 $data、使用する暗号化アルゴリズム $cipher_algo、復号化に使用するパスフレーズ $passphrase を引数として受け取ります。オプションとして、$options で詳細な設定、$iv で初期化ベクトル、$tag で認証タグ、$aad で関連認証データを指定できます。

このサンプルコードでは、decryptData 関数内で openssl_decrypt を使用し、復号化処理を行っています。openssl_decryptfalse を返した場合、エラーが発生したことを意味します。この場合、openssl_error_string() 関数を使用して、OpenSSLのエラーメッセージを取得し、ログに出力します。これにより、デバッグが容易になります。

復号化が成功した場合、復号化されたデータが返されます。エラーが発生した場合は null が返されます。try-catch ブロックを使用することで、例外発生時にもエラーログを出力し、プログラムが予期せず終了するのを防ぎます。

使用例では、$encryptedData$passphrase$cipherAlgorithm$iv に適切な値を設定し、decryptData 関数を呼び出しています。復号化されたデータがある場合は、画面に出力し、エラーが発生した場合はその旨を表示します。初期化ベクトル ($iv) は、暗号化時に使用したものと同じものを指定する必要があります。異なる $iv を使用すると、復号化に失敗します。

openssl_decrypt関数を使う際の注意点です。まず、openssl_decryptは失敗するとfalseを返すため、戻り値がfalseでないか確認が必要です。openssl_error_string()で詳細なエラーメッセージを取得できます。次に、暗号化アルゴリズム (cipher_algo)、パスフレーズ (passphrase)、初期化ベクトル (iv) は、暗号化時と復号化時で完全に一致させる必要があります。特にivは、安全な乱数生成関数で生成し、暗号化されたデータと一緒に安全に保管・伝送してください。OPENSSL_RAW_DATAオプションは、入力および出力データがBase64エンコードされていないことを意味します。パスフレーズは推測されにくい強固なものを選びましょう。

openssl_decryptでデータを復号化する

<?php

/**
 * openssl_decrypt の使用例。
 * 暗号化されたデータを復号化します。
 *
 * openssl_decrypt が期待通りに動作しない場合、以下の点を確認してください。
 * 1. 暗号化に使用した cipher_algo と同じものを指定しているか。
 * 2. 暗号化に使用した passphrase と同じものを指定しているか。
 * 3. 暗号化に使用した IV (初期化ベクトル) と同じものを指定しているか。
 * 4. openssl_encrypt で使用した options と同じものを指定しているか。
 * 5. openssl_encrypt で使用した tag と aad を指定しているか(必要な場合)。
 */
function decrypt_data(string $data, string $cipher_algo, string $passphrase, string $iv = "", string $tag = "", string $aad = ""): string|false
{
    // options はデフォルト値の 0 を使用します。
    $options = 0;

    // 復号化を実行します。
    $decrypted = openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);

    // 復号化が成功した場合は結果を、失敗した場合は false を返します。
    return $decrypted;
}

// サンプルの暗号化されたデータ、cipher_algo、passphrase、IV を定義します。
// 実際には、これらの値は暗号化時に使用したものと同じである必要があります。
$encrypted_data = "your_encrypted_data_here"; // 暗号化された文字列
$cipher_algo = "aes-256-cbc"; // 暗号化アルゴリズム
$passphrase = "your_secret_passphrase"; // パスフレーズ
$iv = "your_initialization_vector"; // 初期化ベクトル (16バイト)

// 復号化を実行します。
$decrypted_data = decrypt_data($encrypted_data, $cipher_algo, $passphrase, $iv);

// 復号化の結果を表示します。
if ($decrypted_data !== false) {
    echo "復号化されたデータ: " . $decrypted_data . PHP_EOL;
} else {
    echo "復号化に失敗しました。" . PHP_EOL;
}

?>

openssl_decrypt関数は、暗号化されたデータを復号化するための関数です。引数として、復号化する文字列 $data、暗号化アルゴリズム $cipher_algo、パスフレーズ $passphrase を必須で指定します。オプションで、$options (通常は0)、初期化ベクトル $iv、認証タグ $tag、追加認証データ $aad を指定できます。

この関数が期待通りに動作しない場合は、以下の点を確認してください。暗号化に使用した $cipher_algo$passphrase$iv と同じものを指定しているか、openssl_encrypt で使用した $options$tag$aad を指定する必要があるかを確認してください。特に初期化ベクトル $iv は、暗号化時と同じ値を指定する必要があります。

関数が成功した場合、復号化された文字列を返します。失敗した場合は false を返します。サンプルコードでは、decrypt_data 関数を定義し、openssl_decrypt を使用して $encrypted_data を復号化しています。復号化が成功した場合は復号化されたデータを、失敗した場合はエラーメッセージを表示します。

openssl_decrypt関数を使う際の注意点です。まず、暗号化時と全く同じ暗号化アルゴリズム($cipher_algo)、パスフレーズ($passphrase)、初期化ベクトル($iv)を使用する必要があります。これらが異なると復号化に失敗します。次に、暗号化時にopenssl_encryptで指定したオプション($options)、認証タグ($tag)、追加認証データ($aad)も、復号化時に同じ値を指定する必要があります。特に初期化ベクトルは、アルゴリズムによっては必須であり、正しい長さを設定してください。サンプルコードでは、これらの変数を適切に設定するように促しています。復号化に失敗した場合はfalseが返るので、必ずエラーハンドリングを行いましょう。

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