搜索
您的当前位置:首页php实现不对称加密的方法

php实现不对称加密的方法

时间:2020-11-02 来源:乌哈旅游

php实现不对称加密的方法:首先创建一个PHP示例文件;然后使用openssl实现非对称加密;最后通过“$rsa = new Rsa('ssl-key');”进行测试即可。

推荐:《PHP视频教程》

PHP实现非对称加密


至于什么是非对称加密,这里就不说啦,大家谷歌去吧。这里说明的是,最近在做一个对外的充值加密服务,那么涉及到这个加密的处理,中间遇到几个小问题,所以记录下,方便自己下次查阅。

详细代码

<?php
/**
 * 使用openssl实现非对称加密
 * 
 * @since 2015-11-10
 */
class Rsa
{
 /**
 * 私钥
 * 
 */
 private $_privKey;
 /**
 * 公钥
 * 
 */
 private $_pubKey;
 /**
 * 保存文件地址
 */
 private $_keyPath;
 /**
 * 指定密钥文件地址
 * 
 */
 public function __construct($path)
 {
 if (empty($path) || !is_dir($path)) {
 throw new Exception('请指定密钥文件地址目录');
 }
 $this->_keyPath = $path;
 }
 /**
 * 创建公钥和私钥
 * 
 */
 public function createKey()
 {
 $config = [
 "config" => 'D:wampinapacheapache2.4.9confopenssl.cnf',
 "digest_alg" => "sha512",
 "private_key_bits" => 4096,
 "private_key_type" => OPENSSL_KEYTYPE_RSA,
 ];
 // 生成私钥
 $rsa = openssl_pkey_new($config);
 openssl_pkey_export($rsa, $privKey, NULL, $config);
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
 $this->_privKey = openssl_pkey_get_public($privKey);
 // 生成公钥
 $rsaPri = openssl_pkey_get_details($rsa);
 $pubKey = $rsaPri['key'];
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 }
 /**
 * 设置私钥
 * 
 */
 public function setupPrivKey()
 {
 if (is_resource($this->_privKey)) {
 return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
 $privKey = file_get_contents($file);
 $this->_privKey = openssl_pkey_get_private($privKey);
 return true;
 }
 /**
 * 设置公钥
 * 
 */
 public function setupPubKey()
 {
 if (is_resource($this->_pubKey)) {
 return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';
 $pubKey = file_get_contents($file);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 return true;
 }
 /**
 * 用私钥加密
 * 
 */
 public function privEncrypt($data)
 {
 if (!is_string($data)) {
 return null;
 }
 $this->setupPrivKey();
 $result = openssl_private_encrypt($data, $encrypted, $this->_privKey);
 if ($result) {
 return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 私钥解密
 * 
 */
 public function privDecrypt($encrypted)
 {
 if (!is_string($encrypted)) {
 return null;
 }
 $this->setupPrivKey();
 $encrypted = base64_decode($encrypted);
 $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
 if ($result) {
 return $decrypted;
 }
 return null;
 }
 /**
 * 公钥加密
 * 
 */
 public function pubEncrypt($data)
 {
 if (!is_string($data)) {
 return null;
 }
 $this->setupPubKey();
 $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
 if ($result) {
 return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 公钥解密
 * 
 */
 public function pubDecrypt($crypted)
 {
 if (!is_string($crypted)) {
 return null;
 }
 $this->setupPubKey();
 $crypted = base64_decode($crypted);
 $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
 if ($result) {
 return $decrypted;
 }
 return null;
 }
 /**
 * __destruct
 * 
 */
 public function __destruct() {
 @fclose($this->_privKey);
 @fclose($this->_pubKey);
 }
}
?>

测试

$rsa = new Rsa('ssl-key');
//私钥加密,公钥解密
echo "待加密数据:segmentfault.com
";
$pre = $rsa->privEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pre . "
";
$pud = $rsa->pubDecrypt($pre);
echo "解密后数据:" . $pud . "
";
//公钥加密,私钥解密
echo "待加密数据:segmentfault.com
";
$pue = $rsa->pubEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pue . "
";
$prd = $rsa->privDecrypt($pue);
echo "解密后数据:" . $prd;

重要问题

这里特别要注意的是在配置中要指定openssl.cnf的文件地址,或者设置个OPENSSL_CONF全局变量就可以了。

Top