php实现不对称加密的方法

互联网 20-8-29

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:\wamp\bin\apache\apache2.4.9\conf\openssl.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\n"; $pre = $rsa->privEncrypt("segmentfault.com"); echo "加密后的密文:\n" . $pre . "\n"; $pud = $rsa->pubDecrypt($pre); echo "解密后数据:" . $pud . "\n"; //公钥加密,私钥解密 echo "待加密数据:segmentfault.com\n"; $pue = $rsa->pubEncrypt("segmentfault.com"); echo "加密后的密文:\n" . $pue . "\n"; $prd = $rsa->privDecrypt($pue); echo "解密后数据:" . $prd;

重要问题

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

以上就是php实现不对称加密的方法的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: PHP
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:php mysql如何修改数据

相关资讯