“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
在许多应用中都会用到AES加密算法,之前写过一个(见本站https://www.indrupal.com/node/159),但用到的PHP扩展和方法被弃用了,
在此云客为水滴间的朋友们重新写一个:
/**
* AES加密类, 加密算法aes-128-cbc,分组长度128比特 加密模式为CBC
* author: yunke
* email: phpworld@qq.com
*/
class AES {
/**
* 使用AES加密算法加密文本
*
* @param $plainText String 明文 不限制位数 即便是空字符""都行
* @param $key String 对称密钥 不限制位数 即便是空字符""都行,但建议在16个字符
*
* @return string base64转码后的密文
*/
public function aesEncrypt($plainText, $key) {
$plainText = $this->addPKCS7Padding($plainText); //填充字符数到分组整数倍
$iv = substr(hash('sha256', $key), 0, 16); //产生初始化加密向量
$encrypt_str = openssl_encrypt($plainText, 'aes-128-cbc', $key, OPENSSL_NO_PADDING, $iv);
return base64_encode($encrypt_str);
}
/**
* AES解密
*
* @param $cipherText String 密文
* @param $key String 对称密钥
*
* @return string
*/
public function aesDecrypt($cipherText, $key) {
$cipherText = base64_decode($cipherText);
$iv = substr(hash('sha256', $key), 0, 16);
$decrypt_str = openssl_decrypt($cipherText, 'aes-128-cbc', $key, OPENSSL_NO_PADDING, $iv);
$decrypt_str = $this->stripPKCS7Padding($decrypt_str);
return $decrypt_str;
}
/**
* 填充算法 将原始明文填充到分组长度的整数倍
* 该算法的特征是无论如何都会被追加字符
*
* @param string $source
*
* @return string
*/
private function addPKCS7Padding($source) {
$block = 16; //分组长度 每组16字节
$pad = $block - (strlen($source) % $block);
$char = chr($pad);
$source .= str_repeat($char, $pad);
return $source;
}
/**
* 移去填充的字符
*
* @param string $source
*
* @return string
*/
private function stripPKCS7Padding($source) {
$char = substr($source, -1);
$num = ord($char);
$source = substr($source, 0, -$num);
return $source;
}
}
由于PHP内部默认就用PKCS7填充方法,所以以上类的功能完全等同如下类:
/**
* AES加密类, 加密算法aes-128-cbc,分组长度128比特 加密模式为CBC
* author: yunke
* email: phpworld@qq.com
*/
class AES {
/**
* 使用AES加密算法加密文本
*
* @param $plainText String 明文 不限制位数 即便是空字符""都行
* @param $key String 对称密钥 不限制位数 即便是空字符""都行,但建议在16个字符
*
* @return string base64转码后的密文
*/
public function aesEncrypt($plainText, $key) {
$iv = substr(hash('sha256', $key), 0, 16); //产生初始化加密向量
return openssl_encrypt($plainText, 'aes-128-cbc', $key, 0, $iv); //也可用aes-128-ctr
}
/**
* AES解密
*
* @param $cipherText String 密文
* @param $key String 对称密钥
*
* @return string
*/
public function aesDecrypt($cipherText, $key) {
$iv = substr(hash('sha256', $key), 0, 16);
return openssl_decrypt($cipherText, 'aes-128-cbc', $key, 0, $iv); //也可用aes-128-ctr
}
}
使用示例如下:
echo "<pre>";
echo $plainText = 'Drupal是目前世界上最强大、最灵活的后端系统,是app、小程序、网站、物联网等信息系统的后端数据和控制中心';
echo "\n";
$key = "本程序作者:云客"; //密码可以是任意字符
$aes = new AES();
echo $cipherText = $aes->aesEncrypt($plainText, $key);
echo "\n";
echo $aes->aesDecrypt($cipherText, $key);
die;
交流互动