関数の概要
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モードのような高度な認証付き復号まで対応でき、セキュリティが求められる開発に欠かせません。エラー処理もしっかり行い、復号失敗の原因をきちんと検証しましょう。
