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

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

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

作成日: 更新日:

基本的な使い方

OPENSSL_CIPHER_RC2_128定数は、PHPのOpenSSL拡張機能において、データ暗号化処理に利用する特定の暗号アルゴリズムとキー長を表す定数です。具体的には、RC2というブロック暗号アルゴリズムを、128ビットのキー長で使用することを示します。

OpenSSL拡張機能は、ウェブアプリケーションなどでデータの機密性を保護するための暗号化や復号化、デジタル署名といったセキュリティ関連機能を提供するライブラリと連携します。この定数は、openssl_encrypt() や openssl_decrypt() といった、実際の暗号化や復号化を行うPHP関数に、どの暗号方式を利用するかを指示する引数として使用されます。

RC2は、可変長のキーを持つブロック暗号アルゴリズムの一つであり、特定の状況下で利用されてきました。OPENSSL_CIPHER_RC2_128 を指定することで、OpenSSLライブラリはRC2アルゴリズムを128ビットの暗号キーで動作させます。この「128ビット」というキー長は、暗号化されたデータの安全性を測る重要な要素の一つです。

システムエンジニアとしてセキュアなシステムを構築する際には、データの種類やセキュリティ要件に応じて適切な暗号アルゴリズムを選択することが求められます。この定数を利用することで、開発者はPHPコード内でRC2-128暗号方式を明確に指定し、重要なデータの保護機能を実現できます。

構文(syntax)

1<?php
2echo OPENSSL_CIPHER_RC2_128;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

OPENSSL_CIPHER_RC2_128は、OpenSSL暗号化ライブラリで使用されるRC2暗号化アルゴリズムの128ビット鍵長バージョンを表す整数定数です。

サンプルコード

PHP openssl_cipher_iv_length でRC2-128 のIV長を取得する

1<?php
2
3// OPENSSL_CIPHER_RC2_128 は、PHPのOpenSSL拡張機能で定義されている定数で、
4// RC2-128という特定の暗号アルゴリズム(128ビットキーのRC2)を示す数値です。
5// openssl_cipher_iv_length 関数は、暗号アルゴリズムの「文字列名」を引数に取ります。
6
7// OPENSSL_CIPHER_RC2_128 定数が指し示す暗号アルゴリズムの標準的な文字列名
8$cipherAlgorithmString = 'RC2-128'; 
9
10// 指定された暗号アルゴリズムに必要な初期化ベクトル (IV) の長さをバイト単位で取得します。
11// IVは、暗号化処理においてデータの多様性を高めるために使われるランダムなデータです。
12$ivLength = openssl_cipher_iv_length($cipherAlgorithmString);
13
14if ($ivLength !== false) {
15    echo "暗号アルゴリズム '{$cipherAlgorithmString}' のIV長は {$ivLength} バイトです。\n";
16    // 補足: OPENSSL_CIPHER_RC2_128 定数自体(整数値)は、
17    // openssl_cipher_iv_length 関数の引数として直接使用することはできません。
18    // 代わりに、対応する文字列名を使用します。
19} else {
20    echo "エラー: 暗号アルゴリズム '{$cipherAlgorithmString}' のIV長を取得できませんでした。\n";
21    echo "指定されたアルゴリズムがOpenSSLでサポートされているか確認してください。\n";
22}
23

PHPのOPENSSL_CIPHER_RC2_128は、バージョン8のOpenSSL拡張機能で定義されている定数です。これは、RC2-128という特定の暗号アルゴリズム(128ビットキーのRC2)を示す整数値であり、暗号化の種類を識別するために内部的に使用されます。

一方、openssl_cipher_iv_length関数は、指定された暗号アルゴリズムが必要とする初期化ベクトル(IV)の長さをバイト単位で取得するために用いられます。IVは、同じ平文(元のデータ)を暗号化しても、毎回異なる暗号文が生成されるようにするために、暗号化処理にランダム性をもたらす重要なデータです。この関数の引数には、暗号アルゴリズムの「文字列名」(例えば'RC2-128')を渡す必要があります。戻り値は、成功時にはIVのバイト長を示す整数となり、指定されたアルゴリズムが見つからないなどのエラーが発生した場合はfalseを返します。

サンプルコードでは、OPENSSL_CIPHER_RC2_128が指し示す暗号アルゴリズムであるRC2-128に対応する文字列'RC2-128'を変数に代入しています。この文字列をopenssl_cipher_iv_length関数に渡すことで、RC2-128暗号に必要なIVの長さを取得し、結果を表示しています。ここで注意すべきは、OPENSSL_CIPHER_RC2_128定数(整数値)そのものをopenssl_cipher_iv_length関数の引数として直接使用できない点です。関数は定数が示すアルゴリズムの標準的な文字列名を要求します。これにより、適切なIVを準備し、セキュアな暗号化処理を実装することが可能になります。

サンプルコードではOPENSSL_CIPHER_RC2_128という定数自体ではなく、その定数が指し示す暗号アルゴリズムの「文字列名」である'RC2-128'をopenssl_cipher_iv_length関数に渡しています。初心者は定数値を直接関数の引数に指定してしまいがちですが、この関数は文字列形式のアルゴリズム名を必要とする点に注意してください。

指定する文字列名はOpenSSLがサポートする正確な形式で記述する必要があります。また、openssl_cipher_iv_length関数の戻り値は、取得失敗時にfalseとなるため、常に結果をチェックし、エラーハンドリングを行うことが重要です。

なお、サンプルで使用されているRC2のような古い暗号アルゴリズムは、現代のセキュリティ標準では推奨されません。新規開発ではAES-256-GCMなど、より強力で最新のアルゴリズムの利用をご検討ください。

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

1<?php
2
3declare(strict_types=1);
4
5/**
6 * AES-256-CBC方式でデータを安全に暗号化・復号化するクラス。
7 * システムエンジニアを目指す初心者向けに、openssl_encrypt/decrypt の基本的な使用法を示します。
8 */
9final class SimpleAes256CbcCipher
10{
11    // 使用する暗号アルゴリズムを指定。キーワード 'aes-256-cbc' に基づく。
12    private const ALGORITHM = 'aes-256-cbc';
13    private string $key;
14
15    /**
16     * コンストラクタ。暗号化・復号化に使用する秘密鍵を設定します。
17     *
18     * @param string $key AES-256-CBCには32バイト (256ビット) の鍵が必要です。
19     * @throws \InvalidArgumentException 鍵の長さが不正な場合。
20     */
21    public function __construct(string $key)
22    {
23        // 鍵のバイト長がアルゴリズム要件 (AES-256-CBCは32バイト) を満たしているか確認。
24        if (mb_strlen($key, '8bit') !== 32) {
25            throw new \InvalidArgumentException('Key must be 32 bytes for aes-256-cbc.');
26        }
27        $this->key = $key;
28    }
29
30    /**
31     * 指定されたデータをAES-256-CBCで暗号化します。
32     *
33     * @param string $data 暗号化する平文データ。
34     * @return string Base64エンコードされたIVと暗号化データの結合文字列。
35     * @throws \RuntimeException 暗号化に失敗した場合。
36     */
37    public function encrypt(string $data): string
38    {
39        // 初期化ベクトル (IV) を生成。IVは毎回異なる値でなければなりません。
40        $ivLength = openssl_cipher_iv_length(self::ALGORITHM);
41        $iv = openssl_random_pseudo_bytes($ivLength);
42        if ($iv === false) {
43            throw new \RuntimeException('Failed to generate IV.');
44        }
45
46        // データを暗号化。OPENSSL_RAW_DATAは生データ形式での出力を指定。
47        $encrypted = openssl_encrypt($data, self::ALGORITHM, $this->key, OPENSSL_RAW_DATA, $iv);
48        if ($encrypted === false) {
49            throw new \RuntimeException('Failed to encrypt data.');
50        }
51
52        // IVと暗号化データを結合し、Base64エンコードして返します。
53        // IVは復号化のために暗号化データと共に保存・転送する必要があります。
54        return base64_encode($iv . $encrypted);
55    }
56
57    /**
58     * 暗号化されたデータをAES-256-CBCで復号化します。
59     *
60     * @param string $encryptedData Base64エンコードされたIVと暗号化データの結合文字列。
61     * @return string 復号化された平文データ。
62     * @throws \RuntimeException 復号化に失敗した場合、またはデータ形式が不正な場合。
63     */
64    public function decrypt(string $encryptedData): string
65    {
66        // Base64デコード。
67        $decoded = base64_decode($encryptedData, true);
68        if ($decoded === false) {
69            throw new \RuntimeException('Invalid Base64 encoded data.');
70        }
71
72        // IVの長さを取得し、デコードされたデータからIVと暗号化データを分離。
73        $ivLength = openssl_cipher_iv_length(self::ALGORITHM);
74        if (mb_strlen($decoded, '8bit') < $ivLength) {
75            throw new \RuntimeException('Invalid encrypted data format: IV missing or corrupted.');
76        }
77        $iv = mb_substr($decoded, 0, $ivLength, '8bit');
78        $cipherText = mb_substr($decoded, $ivLength, null, '8bit');
79
80        // データを復号化。
81        $decrypted = openssl_decrypt($cipherText, self::ALGORITHM, $this->key, OPENSSL_RAW_DATA, $iv);
82        if ($decrypted === false) {
83            throw new \RuntimeException('Failed to decrypt data.');
84        }
85
86        return $decrypted;
87    }
88}
89
90// === 使用例 ===
91
92// 警告: 本番環境では、鍵は安全な方法 (例: 環境変数、専用の鍵管理サービス) で管理し、
93//       ソースコードに直接書き込まないでください。
94//       また、鍵は強力な乱数で一度だけ生成し、再利用しないことが推奨されます。
95//       この例では、32バイト (256ビット) の鍵を固定値で示しています。
96$secretKey = '0123456789abcdef0123456789abcdef'; // 32バイトの鍵の例
97
98$cipher = new SimpleAes256CbcCipher($secretKey);
99
100$originalText = 'これはPHPのAES-256-CBC暗号化のテストメッセージです。';
101
102try {
103    echo "オリジナルテキスト: " . $originalText . PHP_EOL;
104
105    // データの暗号化
106    $encryptedText = $cipher->encrypt($originalText);
107    echo "暗号化されたデータ (Base64): " . $encryptedText . PHP_EOL;
108
109    // 暗号化されたデータの復号化
110    $decryptedText = $cipher->decrypt($encryptedText);
111    echo "復号化されたデータ: " . $decryptedText . PHP_EOL;
112
113    // 結果の確認
114    if ($originalText === $decryptedText) {
115        echo "✅ 暗号化と復号化が成功し、元のテキストと一致しました。" . PHP_EOL;
116    } else {
117        echo "❌ エラー: 暗号化と復号化の結果が一致しません。" . PHP_EOL;
118    }
119} catch (\RuntimeException $e) {
120    echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL;
121}

このPHPコードは、openssl_encryptとopenssl_decrypt関数を使用して、AES-256-CBC方式でデータを安全に暗号化・復号化する方法をシステムエンジニアの初心者向けに示しています。SimpleAes256CbcCipherクラスは、コンストラクタで32バイトの秘密鍵を受け取り、この鍵を用いてデータの保護を行います。

encryptメソッドは、引数で渡された平文データを暗号化します。内部では、openssl_cipher_iv_lengthで取得した長さの初期化ベクトル(IV)をopenssl_random_pseudo_bytesで生成し、openssl_encrypt関数でデータを暗号化します。このIVは復号化に必須なため、暗号化データと結合しBase64エンコードして文字列として返します。

decryptメソッドは、encryptで得られたBase64エンコード文字列を引数とし、これをデコードしてIVと暗号化データを分離します。その後、openssl_decrypt関数で元の平文データに復号化し、その文字列を戻り値として返します。

セキュリティ上の重要な注意点として、鍵は本番環境では安全に管理し、ソースコードに直接記述しないこと、またIVは常にランダムに生成する必要があることを理解してください。OPENSSL_RAW_DATAフラグは、データがパディングなしの生データ形式で扱われることを意味します。

鍵の管理と生成、初期化ベクトル(IV)の適切な生成と取り扱い、そして堅牢なエラー処理が特に重要です。秘密鍵はソースコードに直接含めず、環境変数や専用の鍵管理システムなど、よりセキュアな方法で管理してください。AES-256-CBCでは32バイトの鍵が必要で、鍵は強力な乱数で一度だけ生成し、再利用しないことがセキュリティ上非常に重要です。IVは暗号化のたびに毎回異なる安全な乱数で生成し、暗号文と一緒に保存・転送する必要があります。また、openssl_encryptやopenssl_decryptが失敗する可能性があるため、戻り値の確認と適切な例外処理は必須です。このサンプルコードはAES-256-CBCを利用していますが、他の暗号アルゴリズムを選定する際は、それぞれ適切な鍵長やIV長が異なるため、リファレンスを確認し慎重に選択することが大切です。

関連コンテンツ

関連IT用語

関連プログラミング言語