对称加密是相对于非对称加密存在的。
对称加密,是通过密钥加密后,可以再通过之前加密的密钥进行解密,得到加密之前的信息。
非对称加密,是有公钥和私钥,如果使用公钥加密,那么需要用私钥解密,得到加密之前的信息;同样,如果使用私钥加密,那么需要用公钥解密,得到加密之前的信息。
由于php7已经废弃了mcrypt的内置函数,所以,本篇采用openssl的加密函数。代码如下:
/**
* Class OpensslEncrypt 对称加密类
*/
class OpensslEncrypt
{
const IV = "d89fb057f6d4f03g";//加密向量,16个字节
const KEY = 'e9c8e878ee8e2658';//密钥,16个字节
/**
* 加密字符串
* @param string $strContent 待加密的字符串内容
* @param string $key 加密key
* @return string 返回加密后的字符串,失败返回false
*/
public static function encrypt($strContent,$key = self::KEY,$iv = self::IV){
$strEncrypted = openssl_encrypt($strContent,"AES-128-CBC", $key,OPENSSL_RAW_DATA, $iv);
return base64_encode($strEncrypted);
}
/**
* 解密字符串
* @param string $strEncryptCode加密后的字符串
* @param string $key 加密key
* @return string 返回解密后的字符串,失败返回false
*/
public static function decrypt($strEncryptCode,$key = self::KEY,$iv = self::IV){
$strEncrypted = base64_decode($strEncryptCode);
return openssl_decrypt($strEncrypted,"AES-128-CBC",$key,OPENSSL_RAW_DATA,$iv);
}
}
本篇的AES加密的分组加密模式采用的CBC的模式,所以需要个初始的加密向量(如果采用ECB的模式则不需要加密向量)。
采用base64的编码,是因为openssl_encrypt()得到是原始二进制数据,需要转换一下编码。
OPENSSL_RAW_DATA,是按位或的标记(本处是0),根据这个标记得到原始的二进制数据。
如果想对加密模式有进一步了解,可以参考:https://blog.csdn.net/zp17764507932/article/details/73610466 。
如果想对AES加密的算法有进一步的了解,可以参考:https://blog.csdn.net/qq_28205153/article/details/55798628 。