Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】OPENSSL_RAW_DATA定数の使い方

OPENSSL_RAW_DATA定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

OPENSSL_RAW_DATA定数は、PHPのOpenSSL拡張モジュールにおいて、データの暗号化や復号化を行う特定の関数で利用されるオプションを表す定数です。OpenSSL拡張は、セキュアな通信やデータの保護に不可欠な暗号化技術をPHPで利用可能にするための機能を提供しています。この定数は、主にopenssl_encrypt()openssl_decrypt()などの関数が処理結果のデータをどのような形式で出力するかを制御するために使われます。

具体的には、これらの関数はデフォルトで、処理後のデータをBase64というテキスト形式にエンコードして返すことがあります。これは、バイナリデータをメールやWebフォームなどのテキストベースの環境で安全に転送する際などに便利な形式です。しかし、OPENSSL_RAW_DATA定数をオプションとして指定することで、関数はBase64エンコードを行わず、暗号化または復号化されたデータをそのままの「生(raw)」のバイナリ形式で出力します。

この定数を使用すると、データのバイナリ形式を直接扱いたい場合や、後続の処理でBase64デコードが不要な場合に、余計な処理を省き効率的にデータを取り扱うことが可能になります。特に、ファイルの内容や画像データなど、既にバイナリ形式で扱われているデータを扱う際に、その整合性を保ちながら処理を進めるために役立ちます。関数呼び出しの際のオプション引数として渡すことで、特定の動作を指定する重要な役割を担っています。

構文(syntax)

1<?php
2openssl_encrypt($data, $cipher_algo, $key, OPENSSL_RAW_DATA);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP OpenSSL RAW DATA を使った暗号化・復号化

1<?php
2
3/**
4 * OpenSSLを利用して文字列を暗号化および復号化する関数。
5 * OPENSSL_RAW_DATA 定数の使用例を示します。
6 *
7 * この定数を openssl_encrypt() や openssl_decrypt() のオプションとして指定すると、
8 * 暗号化または復号化されたデータがBASE64エンコードされず、生のバイナリデータとして扱われます。
9 *
10 * @param string $plaintext 暗号化する元の平文データ。
11 * @param string $encryptionKey 暗号化に使用する秘密鍵。
12 * @param string $cipherMethod 暗号化アルゴリズム(例: 'aes-256-cbc')。
13 * @return array|false 成功した場合は暗号化されたデータと復号化されたデータを含む配列、失敗した場合は false。
14 */
15function encryptAndDecryptWithRawData(string $plaintext, string $encryptionKey, string $cipherMethod): array|false
16{
17    // 1. 初期化ベクトル (IV) の生成
18    // IVは暗号化ごとにユニークであるべきです。実際のアプリケーションでは、
19    // openssl_random_pseudo_bytes() や random_bytes() を使用して安全に生成し、
20    // 暗号文と一緒に保存または転送します。
21    $ivLength = openssl_cipher_iv_length($cipherMethod);
22    if ($ivLength === false) {
23        // 指定された暗号メソッドのIV長が取得できない場合
24        return false;
25    }
26    // ここではサンプルコードの簡潔さと再現性のために、キーからIVを派生させています。
27    // 本番環境ではよりセキュアな乱数生成器を使用してください。
28    $iv = substr(hash('sha256', $encryptionKey), 0, $ivLength);
29
30    // 2. OPENSSL_RAW_DATA フラグを指定して暗号化を実行
31    // このフラグを指定することで、openssl_encrypt() は暗号化されたデータを
32    // BASE64エンコードせず、生のバイナリデータとして返します。
33    // このフラグを省略した場合、デフォルトでBASE64エンコードされます。
34    $options = OPENSSL_RAW_DATA;
35
36    $ciphertext = openssl_encrypt($plaintext, $cipherMethod, $encryptionKey, $options, $iv);
37
38    if ($ciphertext === false) {
39        // 暗号化に失敗した場合
40        return false;
41    }
42
43    // 3. OPENSSL_RAW_DATA フラグを指定して復号化を実行
44    // 暗号化時と同じフラグ、キー、IVを使用する必要があります。
45    $decryptedPlaintext = openssl_decrypt($ciphertext, $cipherMethod, $encryptionKey, $options, $iv);
46
47    if ($decryptedPlaintext === false) {
48        // 復号化に失敗した場合
49        return false;
50    }
51
52    return [
53        'original_plaintext' => $plaintext,
54        'ciphertext_raw' => $ciphertext, // 生のバイナリ形式の暗号文
55        'decrypted_plaintext' => $decryptedPlaintext,
56        'iv' => $iv
57    ];
58}
59
60// === サンプル実行部分 ===
61
62// 暗号化する平文データ
63$message = "このメッセージはOPENSSL_RAW_DATA定数を使って暗号化されます。";
64// 暗号化キー (本番環境では安全に生成・管理してください)
65$key = "YourSecureEncryptionKey1234567890ABCDEF";
66// 使用する暗号アルゴリズム
67$cipher = "aes-256-cbc";
68
69// 関数を呼び出して暗号化・復号化を実行
70$result = encryptAndDecryptWithRawData($message, $key, $cipher);
71
72if ($result !== false) {
73    echo "--- OpenSSL_RAW_DATA を使用した暗号化と復号化の例 ---\n";
74    echo "元の平文: " . $result['original_plaintext'] . "\n";
75    // 生のバイナリデータはそのまま表示すると文字化けする可能性があるため、
76    // bin2hex() で16進数文字列に変換して表示します。
77    echo "暗号文 (RAW DATA, 16進数): " . bin2hex($result['ciphertext_raw']) . "\n";
78    echo "IV (16進数): " . bin2hex($result['iv']) . "\n";
79    echo "復号化された平文: " . $result['decrypted_plaintext'] . "\n";
80
81    // 元の平文と復号化された平文が一致するか確認
82    if ($result['original_plaintext'] === $result['decrypted_plaintext']) {
83        echo "結果: 暗号化と復号化は成功し、データは元の状態に戻りました。\n";
84    } else {
85        echo "結果: エラー - 復号化されたデータが元のデータと一致しません。\n";
86    }
87
88    echo "\n--- 参考: OPENSSL_RAW_DATA を使用しない場合 (BASE64エンコード) ---\n";
89    // OPENSSL_RAW_DATA を使用しない場合(オプション引数に0を指定)は、
90    // 暗号文が自動的にBASE64エンコードされます。
91    $ivLength_b64 = openssl_cipher_iv_length($cipher);
92    $iv_b64 = substr(hash('sha256', $key . 'b64_salt_for_iv'), 0, $ivLength_b64); // 別のIVを生成
93    $ciphertext_b64 = openssl_encrypt($message, $cipher, $key, 0, $iv_b64); // オプション引数に0を指定
94    if ($ciphertext_b64 !== false) {
95        echo "暗号文 (BASE64エンコード): " . $ciphertext_b64 . "\n";
96        $decrypted_b64 = openssl_decrypt($ciphertext_b64, $cipher, $key, 0, $iv_b64);
97        if ($decrypted_b64 !== false) {
98            echo "復号化された平文 (BASE64エンコード): " . $decrypted_b64 . "\n";
99        }
100    }
101} else {
102    echo "エラー: 暗号化または復号化の処理中に問題が発生しました。\n";
103}

PHP 8のOPENSSL_RAW_DATA定数は、OpenSSL拡張機能のopenssl_encrypt()およびopenssl_decrypt()関数の動作を制御するために使用されます。この定数を関数のoptions引数に指定することで、暗号化または復号化されるデータをBASE64エンコードせずに、生のバイナリデータとして扱うようになります。デフォルトではBASE64エンコードされますので、生のバイナリデータを直接扱いたい場合にこの定数を使用します。

サンプルコードでは、まずOPENSSL_RAW_DATAをオプションとして設定し、openssl_encrypt()関数に渡して平文を暗号化しています。この関数の戻り値は、指定されたオプションによってBASE64エンコードされていないバイナリ形式の暗号文となります。続いて、同じ定数と鍵、初期化ベクトル(IV)をopenssl_decrypt()関数に渡して復号化を実行します。openssl_decrypt()もこの定数によって、入力されたバイナリ暗号文をそのまま復号化し、元の平文を取り出します。このように、OPENSSL_RAW_DATAは、暗号文のエンコード形式を開発者が明示的に制御するために重要な役割を果たします。

OPENSSL_RAW_DATA定数を使うと、暗号化されたデータはBASE64エンコードされずに生のバイナリ形式で出力されます。このため、暗号文を画面に表示する際にはbin2hex()などで16進数に変換すると、文字化けを防ぐことができます。また、暗号化と復号化で同じキー、初期化ベクトル(IV)、そしてこの定数の指定有無を一致させる必要があります。特に本番環境では、IVはサンプルコードのようにキーから派生させず、random_bytes()などの安全な方法でユニークに生成し、暗号文とは別に安全に管理することが非常に重要です。暗号化・復号化関数は失敗した場合はfalseを返すため、必ずエラーチェックを行ってください。

関連コンテンツ