PHP では、暗号化と復号化に AES CBC モードを使用するのが非常に一般的です。ただし、AES CBC モードを使用して復号化すると、文字化けが発生する可能性があります。この問題は非常に一般的ですが、解決するのは簡単です。この記事では、AES CBC暗号化データをPHPで正常に復号し、文字化けを回避する方法を紹介します。
1. 問題の説明
PHP では、openssl_encrypt 関数と openssl_decrypt 関数を使用して、それぞれ暗号化操作と復号化操作を実行できます。たとえば、次のコードは AES CBC モードを使用してデータを暗号化します。
$key = '1234567890123456'; $data = 'hello world'; $iv = '1234567890123456'; $encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
ここで、$key はキー、$data は暗号化されるデータ、$iv は初期ベクトルです。暗号化後、$encrypted 変数は暗号化されたデータを取得します。次に、これを復号化する必要があります:
$key = '1234567890123456'; $encrypted = 'soLPpFUpwJdVEaYpuu6zRg=='; $iv = '1234567890123456'; $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); echo $decrypted;
ただし、上記のコードを実行すると、次の出力が得られる場合があります:
纭洏鍥?J 鍗虫槑涓?
これは意味不明の部分であり、元のデータではありません。世界 "。これは、復号化関数では入力パラメータの長さに厳しい制限があるため、復号化するデータの長さが正しくないと文字化けが発生するためです。
2. 解決策
この問題を解決するには、AES CBC モードの基本的な知識を理解する必要があります。
AES CBC モードでは、暗号化と復号化の両方に初期化ベクトル (Initialization Vector、IV) が必要です。この初期ベクトルは、暗号化と復号化中に同じ値を使用する必要があります。そうしないと、復号化中にデータ エラーが発生します。
初期化ベクトルの長さは、暗号化アルゴリズムで必要なブロック サイズと等しくなければなりません。たとえば、128 ビット AES CBC モードを使用する場合、初期化ベクトルの長さは 16 バイト (128 ビット / 8 ビット) である必要があります。この要件を満たさない場合、復号時に文字化けなどが発生します。
したがって、入力パラメータの長さが要件を満たしているかどうかを確認する必要があります。長さが不正な場合は、パディング操作が必要です。入力データの長さが暗号化時に使用されたものと同じであることを保証するために、復号化の前にパディングを行うことができます。
上記の問題と解決策を考慮して、以下に示すように、元のコードを変更して AES CBC モードの要件に適合させることができます。
$key = '1234567890123456'; $encrypted = 'soLPpFUpwJdVEaYpuu6zRg=='; $iv = '1234567890123456'; // 检查初始向量长度是否正确 if (strlen($iv) != 16) { echo 'Error: IV length is not valid!'; exit; } // 检查输入参数长度是否正确 $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); if ($decrypted === false) { // 进行填充操作 $padded_data = $encrypted . str_repeat(chr(16), 16 - (strlen($encrypted) % 16)); $decrypted = openssl_decrypt($padded_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); } echo $decrypted;
上記のコードでは、まず次のことを確認します。初期ベクトルの長さは正しいです。正しくない場合は、エラーが出力され、プログラムが終了します。次に、復号前の入力データ長をチェックします。長さが正しくない場合は、データ長が要件を満たすようにパディングが実行されます。
これにより、復号時の文字化けを回避できます。
3. 概要
AES CBC モードを使用して暗号化および復号化を行う場合、入力パラメータの長さが正しくないと、復号化に失敗し、文字化けが発生する可能性があります。この問題を回避するには、入力パラメータの長さをチェックし、必要なパディングを実行する必要があります。
上記は、PHP AES CBC モードで文字化けを復号化する問題に対する私の解決策です。それが役に立てば幸い。
以上がphp aes cbc復号化の文字化けコードを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。