openssl_decrypt

関数の概要

openssl_decryptは、PHPで暗号化されたデータを元の平文に復号するための関数です。OpenSSLライブラリを利用しており、セキュアな暗号方式に対応しています。特に、通信データの復号や機密情報の取り扱いなどで役立ちます。

パラメータの説明

  • data:復号したい暗号化された文字列を指定します。
  • method:使用する暗号化方式の名称を文字列で指定します。例:「AES-128-CBC」など。
  • key:復号に使用する秘密鍵を指定します。暗号化時と同じ鍵を使う必要があります。
  • options(省略可能):復号の動作を制御するオプションフラグ。通常は0で十分です。例えば、OPENSSL_RAW_DATA や OPENSSL_ZERO_PADDING など。
  • iv(省略可能):初期化ベクトルを指定します。暗号化時に同じものを使う必要があります。
  • tag(省略可能):AEAD暗号(例:GCM)で使用される認証タグ。
  • aad(省略可能):AEAD暗号で使用される追加認証データ。

戻り値

復号に成功すると、元の平文文字列を返します。復号に失敗した場合はfalseを返します。復号失敗は、鍵の間違いやデータ破損などが原因です。

使用例

基本的な使い方

$encrypted = 'encrypted_string_here';  // 暗号化されたデータ
$method = 'AES-128-CBC';
$key = 'secretkey1234567';
$iv = '1234567890123456';  // 16バイトの初期化ベクトル

$decrypted = openssl_decrypt($encrypted, $method, $key, 0, $iv);
if ($decrypted === false) {
    echo "復号に失敗しました。";
} else {
    echo "復号データ: " . $decrypted;
}

この例ではAES-128-CBC方式を使い、同じ鍵と初期化ベクトルで復号しています。

Base64エンコードされた暗号文の復号

$encrypted_base64 = 'U2FsdGVkX1+abcd1234...';  // Base64エンコードされた暗号文
$encrypted = base64_decode($encrypted_base64);
$method = 'AES-256-CBC';
$key = 'verysecurekey123';
$iv = substr($key, 0, 16);

$decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;

暗号化データがBase64エンコードされている場合は、復号前にbase64_decodeでバイナリに戻しましょう。

GCMモードでの復号(認証タグ付き)

$encrypted = 'ciphertext_here';
$tag = 'tag_here';
$aad = '追加認証データ';
$key = 'key_32_bytes_long_123456789012';
$iv = '123456789012';  // GCMの推奨12バイト

$decrypted = openssl_decrypt($encrypted, 'AES-256-GCM', $key, 0, $iv, $tag, $aad);

if ($decrypted === false) {
    echo "復号と認証に失敗しました。";
} else {
    echo "復号データ: " . $decrypted;
}

GCMモードは暗号化だけでなく認証タグによる改ざん検出も行います。復号時にはタグと追加認証データを正しく指定する必要があります。

関連する関数

  • openssl_encrypt — データを暗号化する
  • openssl_get_cipher_methods — 利用可能な暗号方式の一覧を取得する
  • bin2hex — バイナリデータを16進数に変換する
  • base64_encode / base64_decode — Base64形式のエンコード・デコード

まとめ

openssl_decryptは、安全に暗号化されたデータを復号するための便利なPHP関数です。同じ暗号化方式、鍵、初期化ベクトルを使うことが重要です。基本的な用途からGCMモードのような高度な認証付き復号まで対応でき、セキュリティが求められる開発に欠かせません。エラー処理もしっかり行い、復号失敗の原因をきちんと検証しましょう。