栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

封装php的非对称加密RSA

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

封装php的非对称加密RSA

class Rsa

{

   

       private $_privKey;


       

       private $_pubKey;


       

       private $_keyPath;


       

       public function __construct($path)

       {

               if(empty($path) || !is_dir($path)){

                       throw new Exception('Must set the keys save path');

               }


               $this->_keyPath = $path;

       }


       

       public function createKey()

       {

               $configargs = array('digest_alg' => 'sha1',

                   'private_key_type' => OPENSSL_KEYTYPE_RSA,

                   'private_key_bits' => 512,

                   "config" => "E:/xampp/php/extras/openssl/openssl.cnf"

               );

               $r = openssl_pkey_new($configargs);

               openssl_pkey_export($r, $privKey,null,$configargs);

               file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);

               $this->_privKey = openssl_pkey_get_private($privKey);


               $rp = openssl_pkey_get_details($r);

               $pubKey = $rp['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';

               $prk = file_get_contents($file);

               $this->_privKey = openssl_pkey_get_private($prk);

               return true;

       }


       

       public function setupPubKey()

       {

               if(is_resource($this->_pubKey)){

                       return true;

               }

               $file = $this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key';

               $puk = file_get_contents($file);

               $this->_pubKey = openssl_pkey_get_public($puk);

               return true;

       }


       

       public function privEncrypt($data)

       {

               if(!is_string($data)){

                       return null;

               }


               $this->setupPrivKey();


               $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);

               if($r){

                       return base64_encode($encrypted);

               }

               return null;

       }


       

       public function privDecrypt($encrypted)

       {

               if(!is_string($encrypted)){

                       return null;

               }


               $this->setupPrivKey();


               $encrypted = base64_decode($encrypted);


               $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);

               if($r){

                       return $decrypted;

               }

               return null;

       }


       

       public function pubEncrypt($data)

       {

               if(!is_string($data)){

                       return null;

               }


               $this->setupPubKey();


               $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);

               if($r){

                       return base64_encode($encrypted);

               }

               return null;

       }


       

       public function pubDecrypt($crypted)

       {

               if(!is_string($crypted)){

                       return null;

               }


               $this->setupPubKey();


               $crypted = base64_decode($crypted);


               $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);

               if($r){

                       return $decrypted;

               }

               return null;

       }


       public function __destruct()

       {

               @ fclose($this->_privKey);

               @ fclose($this->_pubKey);

       }


}


//====================demo=======================

//以下是一个简单的测试demo,如果不需要请删除

$rsa = new Rsa('ssl-key');

$rsa->createKey(); //创建一对密钥,如果密钥对已经存在,不需调用

//私钥加密,公钥解密

echo 'source:就将计就计
';

$pre = $rsa->privEncrypt('就将计就计');

echo 'private encrypted:
' . $pre . '
';


$pud = $rsa->pubDecrypt($pre);

echo 'public decrypted:' . $pud . '
';


//公钥加密,私钥解密

echo 'source:干反方向
';

$pue = $rsa->pubEncrypt('干反方向');

echo 'public encrypt:
' . $pue . '
';


$prd = $rsa->privDecrypt($pue);

echo 'private decrypt:' . $prd;

//========================demo======================


//特别注意:没有openssl.cnf配置,在创建 public/private key 的时候会出现类似以下的问题

//Warning: openssl_pkey_export() [function.openssl-pkey-export]: cannot get key from parameter,

//或者openssl_pkey_export里的私钥生成不了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/228824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号