/**
* php AES暗号化および復号化クラス
* Java は 128 ビット暗号化のみをサポートしているため、PHP も 128 ビット暗号化を使用しており、Java に変換できます。
※同時にAES規格も128ビットとなります。 RIJNDAEL アルゴリズムのみが 128、192、および 256 ビット暗号化をサポートできます。
*
* @著者テリー
* */
クラスPhpAes
{
/**
* これは AES-128 / CBC / ZeroBytePadding で暗号化されました。
* Base64_encode 文字列を返す
* @著者テリー
* @param string $plaintext
* @param string $key */
パブリック静的関数 AesEncrypt($plaintext,$key = null)
{
if ($plaintext == '') return '';
if(!extension_loaded('mcrypt'))
throw new CException(Yii::t('yii','AesEncrypt では、データ暗号化機能を使用するには PHP mcrypt 拡張機能をロードする必要があります。'));
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$plaintext = self::PKCS5Padding($plaintext, $size);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=self::substr($key===null ? Yii::app()->params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));
/* IV を作成し、MCRYPT_RAND を使用してキーサイズの長さを決定します
* 代わりに Windows 上で */
$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
/* 暗号化を初期化します */
mcrypt_generic_init($module, $key, $iv);
/* データを暗号化します */
$encrypted = mcrypt_generic($module, $plaintext);
/* 暗号化ハンドラーを終了します */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
returnbase64_encode(trim($encrypted));
}
/**
* これは AES-128 / CBC / ZeroBytePadding で復号化されました。
* @著者テリー
* @param string $encryptedbase64_encode 暗号化文字列
* @param string $key
* @throws CException
* @戻り文字列 */
パブリック静的関数 AesDecrypt($encrypted, $key = null)
{
if ($encrypted == '') return '';
if(!extension_loaded('mcrypt'))
throw new CException(Yii::t('yii','AesDecrypt では、データ暗号化機能を使用するには PHP mcrypt 拡張機能をロードする必要があります。'));
$ciphertext_dec = Base64_decode($encrypted);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=self::substr($key===null ? Yii::app()->params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));
$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
/* 復号化のために暗号化モジュールを初期化します */
mcrypt_generic_init($module, $key, $iv);
/* 暗号化された文字列を復号化します */
$decrypted = mdecrypt_generic($module, $ciphertext_dec);
/* 復号化ハンドルを終了し、モジュールを閉じる */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return self::UnPKCS5Padding($decrypted);
}
プライベート静的関数 strlen($string)
{
extension_loaded('mbstring') を返します mb_strlen($string,'8bit') : strlen($string);
}
プライベート静的関数substr($string,$start,$length)
{
return extension_loaded('mbstring') ? mb_substr($string,$start,$length,'8bit') : substr($string,$start,$length);
}
プライベート静的関数 PKCS5Padding ($text, $blocksize) {
$pad = $blocksize - (self::strlen($text) % $blocksize);
$text を返します (chr($pad), $pad);
} プライベート静的関数 UnPKCS5Padding($text)
{
$pad = ord($text{self::strlen($text)-1});
if ($pad > self::strlen($text)) return false;
if (strspn($text, chr($pad), self::strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
}
|