PHP-RSA加密解密
作者:admin 发布时间:October 12, 2019 分类:PHP No Comments
demo:
class Rsa
{
private $_config = [
'public_key' => '',
'private_key' => '',
];
public function __construct($private_key_filepath, $public_key_filepath) {
$this->_config['private_key'] = $this->_getContents($private_key_filepath);
$this->_config['public_key'] = $this->_getContents($public_key_filepath);
}
/**
* @uses 获取文件内容
* @param $file_path string
* @return bool|string
*/
private function _getContents($file_path) {
file_exists($file_path) or die ('密钥或公钥的文件路径错误');
return file_get_contents($file_path);
}
/**
* @uses 获取私钥
* @return bool|resource
*/
private function _getPrivateKey() {
$priv_key = $this->_config['private_key'];
return openssl_pkey_get_private($priv_key);
}
/**
* @uses 获取公钥
* @return bool|resource
*/
private function _getPublicKey() {
$public_key = $this->_config['public_key'];
return openssl_pkey_get_public($public_key);
}
/**
* @uses 私钥加密
* @param string $data
* @return null|string
*/
public function privEncrypt($data = '') {
if (!is_string($data)) {
return null;
}
return openssl_private_encrypt($data, $encrypted, $this->_getPrivateKey()) ? base64_encode($encrypted) : null;
}
/**
* @uses 公钥加密
* @param string $data
* @return null|string
*/
public function publicEncrypt($data = '') {
if (!is_string($data)) {
return null;
}
return openssl_public_encrypt($data, $encrypted, $this->_getPublicKey()) ? base64_encode($encrypted) : null;
}
/**
* @uses 私钥解密
* @param string $encrypted
* @return null
*/
public function privDecrypt($encrypted = '') {
if (!is_string($encrypted)) {
return null;
}
return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->_getPrivateKey())) ? $decrypted : null;
}
/**
* @uses 公钥解密
* @param string $encrypted
* @return null
*/
public function publicDecrypt($encrypted = '') {
if (!is_string($encrypted)) {
return null;
}
return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->_getPublicKey())) ? $decrypted : null;
}
}
测试:
$private_key = 'private_key.pem'; // 私钥路径
$public_key = 'rsa_public_key.pem'; // 公钥路径
$rsa = new Rsa($private_key, $public_key);
$origin_data = '这是一条测试数据';
$ecryption_data = $rsa->privEncrypt($origin_data);
$decryption_data = $rsa->publicDecrypt($ecryption_data);
echo '私钥加密后的数据为:' . $ecryption_data;
echo PHP_EOL;
echo '公钥解密后的数据为: ' . $decryption_data;
echo PHP_EOL;
最后要说明的是,公钥、私钥都可以加密,也都可以解密。其中:用公钥加密需要私钥解密,称为“加密”。由于私钥是不公开的,确保了内容的保密,没有私钥无法获得内容;用私钥加密需要公钥解密,称为“签名”。由于公钥是公开的,任何人都可以解密内容,但只能用发布者的公钥解密,验证了内容是该发布者发出的。