AES对称加密与RSA非对称加密

对称加密与非对称加密

对称加密: 加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

非对称加密: 加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为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;
}