对称加密与非对称加密
对称加密: 加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
非对称加密: 加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
AES对称加密
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图
密钥K
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。
AES基础结构
https://blog.csdn.net/zxh2075/article/details/80630296
加密函数
https://www.php.net/manual/zh/function.openssl-encrypt.php
加密算法:
https://www.php.net/manual/zh/function.openssl-get-cipher-methods.php
AES加密php demo
//16位 AES加密key public function randomKey() { $str = '0123456789ABCDEF'; $key = ''; for ($i = 0; $i < 16; $i++) { $no = mt_rand(0, 15); $key .= $str[$no]; } return $key; } // AES加密 protected function msgAesEncode($data, $aes_key = '') { $aes_key = $this->randomKey(); $str = openssl_encrypt($data, 'AES-128-ECB', $aes_key, OPENSSL_RAW_DATA); return base64_encode($str); } //AES 解密, 注意key要和加密key相同 protected function msgAesDecode($data, $aes_key = '') { return openssl_decrypt(base64_decode($data), 'AES-128-ECB', $aes_key, OPENSSL_RAW_DATA); }
RSA加密
RSA公钥加密demo, 用于aes key 加密传输
//check rsa 公钥加密
protected function checkRsaPubEncrypt($input)
{
$return = ['success' => 0, 'msg' => '', 'check' => ''];
$publicKey = file_get_contents(ROOT_PATH . 'public/certs/58/service.crt'); //公钥
if (openssl_public_encrypt($input['data'], $encrypted, openssl_get_publickey($publicKey), OPENSSL_PKCS1_PADDING)) { //填充方式
$return['success'] = 1;
$return['check'] = base64_encode($encrypted);
$return['msg'] = base64_encode($input['data']);
}
return $return['check'];
}
RSA私钥加密, 多用于sign签名
//私钥签名
protected function signEncrypt($data = [])
{
$str = $this->_signStr($data);
$return = array('success' => 0, 'msg' => '', 'sign' => '');
$pkcs12 = file_get_contents(ROOT_PATH . 'public/certs/58/client.pfx');
if (openssl_pkcs12_read($pkcs12, $certs, $this->pfxpassword)) {
$privateKey = $certs['pkey'];
$publicKey = $certs['cert'];
$signedMsg = "";
if (openssl_sign($str, $signedMsg, $privateKey, OPENSSL_ALGO_SHA256)) { //签名算法 , OPENSSL_ALGO_SHA1
$return['success'] = 1;
$return['sign'] = base64_encode($signedMsg);
$return['msg'] = base64_encode($str);
}
}
return $return['sign'];
}
protected function _signStr($myParams)
{
ksort($myParams);
$signStr = "";
foreach ($myParams as $key => $val) {
$signStr .= $key . '=' . $val . '&';
}
$signStr = rtrim($signStr, '&');
return $signStr;
}