1. 云栖社区>
  2. PHP教程>
  3. 正文

PHP实现非对称加密

作者:用户 来源:互联网 时间:2017-12-01 13:04:18

加密对称

PHP实现非对称加密 - 摘要: 本文讲的是PHP实现非对称加密, 非对称加密 至于什么是非对称加密,这里就不说啦,大家谷歌去吧。这里说明的是,最近在做一个对外的充值加密服务,那么涉及到这个加密的处理,中间遇到几个小问题,所以记录下,方便自己下次查阅。 详细代码 <?php/** * 使用opens

非对称加密

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

详细代码

<?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($r);$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全局变量就可以了。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索加密 对称 ,以便于您获取更多的相关知识。