站长资讯网
最全最丰富的资讯网站

php实现不对称加密的方法

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

php实现不对称加密的方法

推荐:《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:wampbinapacheapache2.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.comn"; $pre = $rsa->privEncrypt("segmentfault.com"); echo "加密后的密文:n" . $pre . "n"; $pud = $rsa->pubDecrypt($pre); echo "解密后数据:" . $pud . "n"; //公钥加密,私钥解密 echo "待加密数据:segmentfault.comn"; $pue = $rsa->pubEncrypt("segmentfault.com"); echo "加密后的密文:n" . $pue . "n"; $prd = $rsa->privDecrypt($pue); echo "解密后数据:" . $prd;

重要问题

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

赞(0)
分享到: 更多 (0)

网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号