RSA.PHP
public function __construct()
{
$priv_key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/rsa_private.key');
$pub_key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/rsa_public.key');
// $priv_key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/private.key');
// $pub_key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/public.pem');
// $pub_key = $this->publicKey;
$this->privateKey = openssl_pkey_get_private($priv_key);//私钥,用于加密
$this->publicKey = openssl_pkey_get_public($pub_key);//公钥,用于解密*/
}
/**
* 私钥加密
* @param 原始数据 $data
* @return 密文结果 string
*/
public function encryptByPrivateKey($data)
{
openssl_private_encrypt($data, $encrypted, $this->privateKey, OPENSSL_PKCS1_PADDING);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
return $encrypted;
}
/**
* 私钥解密
* @param 密文数据 $data
* @return 原文数据结果 string
*/
public function decryptByPrivateKey($data)
{
$data = base64_decode($data);
openssl_private_decrypt($data, $encrypted, $this->privateKey, OPENSSL_PKCS1_PADDING);//私钥解密
return $encrypted;
}
/**
* 私钥签名
* @param unknown $data
*/
public function signByPrivateKey($data)
{
openssl_sign($data, $signature, $this->privateKey);
$encrypted = base64_encode($signature);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
return $encrypted;
}
/**
* 公钥加密
* @param 原文数据 $data
* @return 加密结果 string
*/
public function encryptByPublicKey($data)
{
openssl_public_encrypt($data, $decrypted, $this->publicKey, OPENSSL_PKCS1_PADDING);//公钥加密
return base64_encode($decrypted);
}
/**
* 公钥解密
* @param 密文数据 $data
* @return 原文结果 string
*/
public function decryptByPublicKey($data)
{
$data = base64_decode($data);
openssl_public_decrypt($data, $encrypted, $this->publicKey, OPENSSL_PKCS1_PADDING);//公钥解密
return $encrypted;
}
/**
* 公钥验签
* @param unknown $data
* @param unknown $sign
*/
public function verifyByPublicKey($data, $sign)
{
$sign = base64_decode($sign);
return openssl_verify($data, $sign, $this->publicKey);
}
public function __destruct()
{
openssl_free_key($this->privateKey);
openssl_free_key($this->publicKey);
}
AES.PHP 加密
class AES extends Controller
{
protected $key;
protected $method;
protected $iv;
protected $options;
public function __construct($key, $method = 'AES-128-ECB', $iv = '', $options = OPENSSL_RAW_DATA )
{
$this->key = isset($key) ? $key : exit('key为必须项');
$this->method = $method;
$this->iv = $iv;
$this->options = $options;
}
/**
*
* @param string $string 需要加密的字符串
* @return string
*/
public function encrypt( $string )
{
/*$key = substr(openssl_digest(openssl_digest($string, 'sha1', true), 'sha1', true), 0, 16);
$data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
return urlencode(base64_encode($data));*/
/*if (strlen($string) % 16) {
$string = str_pad($string,strlen($string) + 16 - strlen($string) % 16, "\0");
}
$encrypted = openssl_encrypt($string, 'AES-128-ECB',$this->key,OPENSSL_ZERO_PADDING,$this->iv);
return base64_encode($encrypted);*/
return base64_encode(openssl_encrypt($string, $this->method,$this->key,$this->options,$this->iv));
}
/**
* @param string $string 需要解密的字符串
* @param string $key 密钥
* @return string
*/
public function decrypt($string)
{
return openssl_decrypt(base64_decode($string), $this->method, $this->key, $this->options,$this->iv);
}
}
工具类
public $RSA = 'rsa';
public $AES_128 = 'aes_128';
/**
* 加密
* @param $value
* @param string $key
* @param $type
* @return \app\common\library\加密结果|null|string
*/
public static function encrypt($value, $type, $key = '')
{
switch ($type) {
case 'aes_128':
$rsa = new AES($key);
return $rsa->encrypt($value);
case 'rsa':
$rsa = new RSA();
return $rsa->encryptByPublicKey($value);
default:
return null;
}
}
/**
* 解密
* @param $value
* @param $type
* @param string $key
* @return 原文数据结果|string|null
*/
public static function decrypt($value, $type, $key = '')
{
switch ($type) {
case 'aes_128':
$rsa = new AES($key);
return $rsa->decrypt($value);
case 'rsa':
$rsa = new RSA();
return $rsa->decryptByPrivateKey($value);
default:
return null;
}
}