2012年1月26日木曜日

[PHP]AESで暗号化・復号化

暗号化と復号化する処理です。
基本的にはmanualに書いてある通りです。

受け取った文字をbase64でエンコードして、暗号化して、暗号化した文字もbase64でエンコードしています。
復号化の際も同じ感じです。

暗号・復号処理に関していつものことなのが、これがAESでうまく暗号化されているかはよく分からず、復号化がうまくいっているので良しとしています。


static public function Encrypt($value){

 //Base64でエンコードする
 $encodedValue = base64_encode($value);

 /* 暗号モジュールをオープンします */
 $td = self::getCryptModule();

 /* データを暗号化します */
 $encrypted = mcrypt_generic($td, $encodedValue);

 //暗号化された文字をBase64でエンコードする
 $encodedEncryptValue = base64_encode($encrypted);

 /* 暗号化ハンドラを終了します */
 mcrypt_generic_deinit($td);

 /* モジュールを閉じます */
 mcrypt_module_close($td);

 return $encodedEncryptValue;
}


static public function Decrypt($value){

 //Base64デコードする
 $decodedValue = base64_decode($value);

 /* 暗号モジュールをオープンします */
 $td = self::getCryptModule();

 /* 暗号化された文字列を復号します */
 $decrypted = mdecrypt_generic($td, $decodedValue);

 /* 復号ハンドルを終了し、モジュールを閉じます */
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);

 //Base64デコードする
 $decodedDecryptValue = base64_decode($decrypted);

 return $decodedDecryptValue;

}

static private function getCryptModule()
{

 /* 暗号モジュールをオープンします */
 //$td = mcrypt_module_open('tripledes', '', MCRYPT_MODE_ECB, '');
 $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, '');

 /* IV を作成し、キー長を定義します。Windows では、かわりに
  * MCRYPT_RAND を使用します */
 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
 $ks = mcrypt_enc_get_key_size($td);

 /* キーを作成します */
 $key = substr(md5('very secret key'), 0, $ks);

 /* 復号用の暗号モジュールを初期化します */
 mcrypt_generic_init($td, $key, $iv);

 return $td;
}


0 件のコメント: