PHPでAES暗号化復号化
PHPでAES暗号を使うには「openssl_encrypt」関数を使います。
$暗号化データ = openssl_encrypt( データ, '復号化方式', 鍵, オプション=0, 初期ベクトル=null );
PHPでAES復号を使うには「openssl_decrypt」関数を使います。
$復号化データ = openssl_decrypt( 暗号化データ, '復号化方式', 鍵, オプション=0, 初期ベクトル=null );
- 復号化方式
-
主に以下の暗号化方式を文字列で指定します。
主な暗号方式 暗号化方式 ブロックサイズ 鍵長 初期化ベクトル(IV) AES-128-ECB 128Bit(16Byte) 128Bit(16Byte) 無し AES-192-ECB 128Bit(16Byte) 192Bit(24Byte) 無し AES-256-ECB 128Bit(16Byte) 256Bit(32Byte) 無し AES-128-CBC 128Bit(16Byte) 128Bit(16Byte) 128Bit(16Byte) AES-192-CBC 128Bit(16Byte) 192Bit(24Byte) 128Bit(16Byte) AES-256-CBC 128Bit(16Byte) 256Bit(32Byte) 128Bit(16Byte) - オプション
-
オプションが不要な場合は 0 を指定します。
オプションが必要な場合は以下をORで組み合わせ出来ます。
- OPENSSL_RAW_DATA
-
この値が設定されていないと、暗号化時に暗号化データはBase64エンコードされ、復号化時に暗号化データはBase64エンコードされているとみなされます。
この値が設定されていると、暗号化時に暗号化データは生データになり、復号化時に暗号化データは生データとみなされます。 - OPENSSL_ZERO_PADDING (非推奨)
- この値が設定されていないと、暗号化時に暗号化データは標準的にパディングされ、復号化時に暗号化データは標準的にパディングされているとみなされます。 この値が設定されていると、暗号化時に暗号化データは標準的にパディングされません。 パディングされていないと復号化時に問題が発生する場合があるのでこのオプションは設定しないことをお勧めします。
- AES暗号には種類がありますが、ECBモードはメッセージの機密性の保持には向かないため、現在、最も広く使用されているCBCモード(※1)を推奨します。
-
(※1)CBCモード
ブロック毎に前のブロックの暗号化の結果とXORした値に暗号化処理を行う。ただし、最初のブロックは初期ベクトルとXORした値に暗号化処理を行う。
AES-128-ECB 暗号化 復号化(非推奨)
非推奨ですが、PHPでAES-128-ECBで暗号化、復号化するソースコードです。
ECBモードには初期ベクトルの指定は不要です。
//暗号化したいデータ $data="This is a pen."; //鍵(16バイト) $key="abcdefghijklmnop"; //暗号化 $enc=openssl_encrypt($data, "AES-128-ECB", $key); //復号化 $dec=openssl_decrypt($enc, "AES-128-ECB", $key); echo "もとのデータ:". $data ."\r\n"; echo "暗号化データ:". $enc ."\r\n"; echo "復号化データ:". $dec ."\r\n"; もとのデータ:This is a pen. 暗号化データ:lmSJdRn0y/BTEiiM0dKoPw== 復号化データ:This is a pen.
AES-128-CBC 暗号化 復号化(あまりお勧めしない)
PHPでAES-128-CBCで暗号化、復号化するソースコードです。
//暗号化したいデータ $data="This is a pen."; //鍵(16バイト) $key="abcdefghijklmnop"; //初期ベクトル(16バイト) $iv="1234567890123456"; //暗号化 $enc=openssl_encrypt($data, "AES-128-CBC", $key, 0, $iv); //復号化 $dec=openssl_decrypt($enc, "AES-128-CBC", $key, 0, $iv); echo "もとのデータ:". $data ."\r\n"; echo "暗号化データ:". $enc ."\r\n"; echo "復号化データ:". $dec ."\r\n"; もとのデータ:This is a pen. 暗号化データ:3zKndUrmc4QGLX/xeWL0nQ== 復号化データ:This is a pen.
AES-256-CBC 暗号化 復号化(鍵生成にソルト値を使用する)
PHPで鍵生成にソルト値を用いてAES-256-CBCで暗号化、復号化するソースコードです。
「パスワード + 乱数生成したソルト値」 のSHA256ハッシュ値を鍵として使います。
このソースコードの場合、同じ値を暗号化しても毎回鍵が変わるので暗号化後の値が変化します。
function encrypt($data,$password,$iv){ $salt = openssl_random_pseudo_bytes(8);//ランダムな8バイトのsalt値を生成 $key = hash('sha256', $password.$salt, true);//パスワード+salt値から32バイト鍵を生成 $enc = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); return base64_encode($salt.$enc); } function decrypt($enc,$password,$iv){ $data=base64_decode($enc); $salt=substr($data,0,8);//先頭8byteがsalt値 $ct =substr($data,8); //8バイト以降が暗号化データ $key =hash('sha256', $password.$salt, true); return openssl_decrypt($ct, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); } //暗号化したいデータ $data="This is a pen."; //パスワード(長いほうが好ましい) $password="abcdefghijklmnopqrstuvwxyzABCDEF"; //初期ベクトル(16バイト) $iv="1234567890123456"; //暗号化 $enc=encrypt($data, $password, $iv); //復号化 $dec=decrypt($enc, $password, $iv); echo "もとのデータ:". $data ."\r\n"; echo "暗号化データ:". $enc ."\r\n"; echo "復号化データ:". $dec ."\r\n"; //暗号化 $enc=encrypt($data, $password, $iv); //復号化 $dec=decrypt($enc, $password, $iv); echo "もとのデータ:". $data ."\r\n"; echo "暗号化データ:". $enc ."\r\n"; echo "復号化データ:". $dec ."\r\n"; もとのデータ:This is a pen. 暗号化データ:ek2+Zp9cHvOz7/kT5v1ukf2jQ57RJhB9 復号化データ:This is a pen. もとのデータ:This is a pen. 暗号化データ:McB09yHqI6NUJXXZbRGTRCPTqsdSFQGD 復号化データ:This is a pen.