本篇文章給大家介紹一下php7+中使用openssl替代mcrypt進行AES加密解密的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

mcrypt十年過去,現在php7+中已經開始淘汰。官方給出掉提示:
mcrypt_get_block_size — 獲得加密算法的分組大小
Warning
This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.
在php7中需要openssl替代,這里需要注意的是:
在mcrypt中對加密key長度沒有限制要求,傳入多少長度都會參加加密,但是在openssl_encrypt中。key長度只能是16長度,>16長度后,簽名結果保持不變,這里是哥坑,在替代方案測試時候容易出錯,具體直接上代碼對比:
低于php7版本代碼
class AES {
public static function encrypt($input,$key) {
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$paddedData = static::pkcs5_pad($input, $blockSize);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $paddedData, MCRYPT_MODE_ECB, $iv);
return bin2hex($encrypted);
}
private static function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
public static function decrypt($sStr,$key) {
$decrypted= mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
hex2bin($sStr),
MCRYPT_MODE_ECB
);
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}
/**
*url 安全的base64編碼 sunlonglong
*/
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
/**
*url 安全的base64解碼 sunlonglong
*/
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
}
$key = 'g87y65ki6e8p93av8zjdrtfdrtgdwetd';
$encrypt = AES::encrypt('123abc',$key);
$decrypt = AES::decrypt($encrypt,$key);
var_dump($encrypt,$decrypt);加密結果:
da07f6363eb0024b4bdd264e5fd4a2f5
下面是php7以上。使用openssl加密:
class AES {
/**
*
* @param string $string 需要加密的字符串
* @param string $key 密鑰
* @return string
*/
public static function encrypt($string, $key)
{
// openssl_encrypt 加密不同Mcrypt,對秘鑰長度要求,超出16加密結果不變
$data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
$data = strtolower(bin2hex($data));
return $data;
}
/**
* @param string $string 需要解密的字符串
* @param string $key 密鑰
* @return string
*/
public static function decrypt($string, $key)
{
$decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
return $decrypted;
}
}
$encrypt = AES::encrypt('123abc', 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
$decrypt = AES::decrypt($encrypt, 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
var_dump($encrypt,$decrypt);die;加密結果:
8c927c42f93a83c5de763aa18e4e6c7d
雖然key長度32位,但是openssl_encrypt加密時候,key長度只使用了16長度,后面未參加簽名,而mcrypt_encrypt會整個key參與加密,這樣就會出現加密出來對結果不一致。造成困惑,key=g87y65ki6e8p93av8zjdrtfdrtgdwetd與key=g87y65ki6e8p93av結果都是一致對;






