当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP封装的非对称加密RSA算法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-20 15:52:33 浏览: 评论:0 

本文实例讲述了PHP封装的非对称加密RSA算法,分享给大家供大家参考,具体如下:

将php的openssl扩展中的非对称加密函数封装成一个Rsa类。

需要注意的是,在windows上,需要打开openssl的配置文件,请参照官方的openssl扩展安装文档。

在windows上安装openssl扩展

1、将php路径下的两个库文件libeay32.dll和ssleay32.dll复制到操作system32下

2、配置openssl配置文件的位置,在php的路径下,有文件extras/openssl/openssl.cnf,添加环境变量OPENSSL_CONF指向这个文件的全路径。如何添加环境变量请google搜索之。

3、在php.ini里添加一行extension=php_openssl.dll

使用的demo:

  1. //====================demo======================= 
  2. //以下是一个简单的测试demo,如果不需要请删除 
  3. $rsa = new Rsa('sslkey'); //sslkey为存放密钥的路径,将已有的密钥文件复制到该路径下,公钥名称为pub.key,私钥名称为priv.key 
  4. $rsa->createKey(); //创建一对密钥,如果密钥对已经存在,不需调用 
  5. //私钥加密,公钥解密 
  6. echo 'source:脚本之家<br />'
  7. $pre = $rsa->privEncrypt('脚本之家'); 
  8. echo 'private encrypted:<br />' . $pre . '<br />'
  9. $pud = $rsa->pubDecrypt($pre); 
  10. echo 'public decrypted:' . $pud . '<br />'
  11. //公钥加密,私钥解密 
  12. echo 'source:干IT的<br />'
  13. $pue = $rsa->pubEncrypt('干IT的'); 
  14. echo 'public encrypt:<br />' . $pue . '<br />'
  15. $prd = $rsa->privDecrypt($pue); 
  16. echo 'private decrypt:' . $prd
  17. //========================demo====================== 
  18. //====================demo======================= 
  19. //以下是一个简单的测试demo,如果不需要请删除 
  20. $rsa = new Rsa('sslkey'); //sslkey为存放密钥的路径,将已有的密钥文件复制到该路径下,公钥名称为pub.key,私钥名称为priv.key 
  21. $rsa->createKey(); //创建一对密钥,如果密钥对已经存在,不需调用 
  22. //私钥加密,公钥解密 
  23. echo 'source:脚本之家<br />'
  24. $pre = $rsa->privEncrypt('脚本之家'); 
  25. echo 'private encrypted:<br />' . $pre . '<br />'
  26. $pud = $rsa->pubDecrypt($pre); 
  27. echo 'public decrypted:' . $pud . '<br />'
  28. //公钥加密,私钥解密 
  29. echo 'source:干IT的<br />'
  30. $pue = $rsa->pubEncrypt('干IT的'); 
  31. echo 'public encrypt:<br />' . $pue . '<br />'
  32. $prd = $rsa->privDecrypt($pue); 
  33. echo 'private decrypt:' . $prd
  34. //========================demo====================== 

本示例在windows7、php 5.2.14、openssl 0.98下开发

  1. <?php 
  2. /** 
  3.  * 使用openssl实现非对称加密 
  4.  * 
  5.  */ 
  6. class Rsa 
  7.   /** 
  8.    * private key 
  9.    */ 
  10.     private $_privKey
  11.     /** 
  12.      * public key 
  13.      */ 
  14.     private $_pubKey
  15.     /** 
  16.      * the keys saving path 
  17.      */ 
  18.     private $_keyPath
  19.     /** 
  20.      * the construtor,the param $path is the keys saving path 
  21.      */ 
  22.     public function __construct($path
  23.     { 
  24.         if(emptyempty($path) || !is_dir($path)){ 
  25.             throw new Exception('Must set the keys save path'); 
  26.         } 
  27.         $this->_keyPath = $path
  28.     } 
  29.     /** 
  30.      * create the key pair,save the key to $this->_keyPath 
  31.      */ 
  32.     public function createKey() 
  33.     { 
  34.         $r = openssl_pkey_new(); 
  35.         openssl_pkey_export($r$privKey); 
  36.         file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key'$privKey); 
  37.         $this->_privKey = openssl_pkey_get_private($privKey); 
  38.         $rp = openssl_pkey_get_details($r); 
  39.         $pubKey = $rp['key']; 
  40.         file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key'$pubKey); 
  41.         $this->_pubKey = openssl_pkey_get_public($pubKey); 
  42.     } 
  43.     /** 
  44.      * setup the private key 
  45.      */ 
  46.     public function setupPrivKey() 
  47.     { 
  48.         if(is_resource($this->_privKey)){ 
  49.             return true; 
  50.         } 
  51.         $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key'
  52.         $prk = file_get_contents($file); 
  53.         $this->_privKey = openssl_pkey_get_private($prk); 
  54.         return true; 
  55.     } 
  56.     /** 
  57.      * setup the public key 
  58.      */ 
  59.     public function setupPubKey() 
  60.     { 
  61.         if(is_resource($this->_pubKey)){ 
  62.             return true; 
  63.         } 
  64.         $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key'
  65.         $puk = file_get_contents($file); 
  66.         $this->_pubKey = openssl_pkey_get_public($puk); 
  67.         return true; 
  68.     } 
  69.     /** 
  70.      * encrypt with the private key 
  71.      */ 
  72.     public function privEncrypt($data
  73.     { 
  74.         if(!is_string($data)){ 
  75.             return null; 
  76.         } 
  77.         $this->setupPrivKey(); 
  78.         $r = openssl_private_encrypt($data$encrypted$this->_privKey); 
  79.         if($r){ 
  80.             return base64_encode($encrypted); 
  81.         } 
  82.         return null; 
  83.     } 
  84.     /** 
  85.      * decrypt with the private key 
  86.      */ 
  87.     public function privDecrypt($encrypted
  88.     { 
  89.         if(!is_string($encrypted)){ 
  90.             return null; 
  91.         } 
  92.         $this->setupPrivKey(); 
  93.         $encrypted = base64_decode($encrypted); 
  94.         $r = openssl_private_decrypt($encrypted$decrypted$this->_privKey); 
  95.         if($r){ 
  96.             return $decrypted
  97.         } 
  98.         return null; 
  99.     } 
  100.     /** 
  101.      * encrypt with public key 
  102.      */ 
  103.     public function pubEncrypt($data
  104.     { 
  105.         if(!is_string($data)){ 
  106.             return null; 
  107.         } 
  108.         $this->setupPubKey(); 
  109.         $r = openssl_public_encrypt($data$encrypted$this->_pubKey); 
  110.         if($r){ 
  111.             return base64_encode($encrypted); 
  112.         } 
  113.         return null; 
  114.     } 
  115.     /** 
  116.      * decrypt with the public key 
  117.      */ 
  118.     public function pubDecrypt($crypted
  119.     { 
  120.         if(!is_string($crypted)){ 
  121.             return null; 
  122.         } 
  123.         $this->setupPubKey(); 
  124.         $crypted = base64_decode($crypted); 
  125.         $r = openssl_public_decrypt($crypted$decrypted$this->_pubKey); 
  126.         if($r){ 
  127.             return $decrypted
  128.         } 
  129.         return null; 
  130.     } 
  131.     public function __destruct() 
  132.     { 
  133.         @ fclose($this->_privKey); 
  134.         @ fclose($this->_pubKey); 
  135.     } 
  136. }

Tags: PHP封装加密 RSA算法

分享到: