zoukankan      html  css  js  c++  java
  • [转]php rsa加密解密实例

    转自:http://blog.csdn.net/clh604/article/details/20224735

    php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密

    1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

    下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

    openssl genrsa -out rsa_private_key.pem 1024
    openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
    openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

    第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
    从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端

    2、php中用生成的公钥、私钥进行加密解密,直接上代码

    [php] view plaincopy在CODE上查看代码片派生到我的代码片
     
      1. <?php  
      2. $private_key = '-----BEGIN RSA PRIVATE KEY-----  
      3. MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl  
      4. TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/  
      5. Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB  
      6. AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH  
      7. 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6  
      8. ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL  
      9. 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq  
      10. deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+  
      11. qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f  
      12. oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2  
      13. 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL  
      14. QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY  
      15. yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c  
      16. -----END RSA PRIVATE KEY-----';  
      17.   
      18. $public_key = '-----BEGIN PUBLIC KEY-----  
      19. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt  
      20. 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl  
      21. Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o  
      22. 2n1vP1D+tD3amHsK7QIDAQAB  
      23. -----END PUBLIC KEY-----';  
      24.   
      25. //echo $private_key;  
      26. $pi_key =  openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id  
      27. $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的  
      28. print_r($pi_key);echo " ";  
      29. print_r($pu_key);echo " ";  
      30.   
      31.   
      32. $data = "aassssasssddd";//原始数据  
      33. $encrypted = "";   
      34. $decrypted = "";   
      35.   
      36. echo "source data:",$data," ";  
      37.   
      38. echo "private key encrypt: ";  
      39.   
      40. openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密  
      41. $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的  
      42. echo $encrypted," ";  
      43.   
      44. echo "public key decrypt: ";  
      45.   
      46. openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来  
      47. echo $decrypted," ";  
      48.   
      49. echo "--------------------------------------- ";  
      50. echo "public key encrypt: ";  
      51.   
      52. openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密  
      53. $encrypted = base64_encode($encrypted);  
      54. echo $encrypted," ";  
      55.   
      56. echo "private key decrypt: ";  
      57. openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密  
      58. echo $decrypted," ";  
    <?php
    /*
     * 使用openssl实现RSA非对称加密
     *
     * @version $Id: Rsa.php 2812 2014-08-14 08:20:19 $
     */
    
    class Rsa
    {
        /**
         * 私钥
         *
         * @var string
         */    
        private $_privateKey = '';
    
        /**
         * 公钥
         *
         * @var string
         */
        private $_publicKey = '';
    
    
        /**
         * 设置私钥路径
         *
         * @param  string $privateKeyPath 私钥路径
         * @param  string $passphrase       私钥密码
         * @return void
         */
        public function setPrivateKeyPath($privateKeyPath, $passphrase = '')
        {
            $privateKey = file_get_contents($privateKeyPath);
    
            $this->setPrivateKey($privateKey, $passphrase);
        }
    
        /**
         * 设置公钥路径
         *
         * @param  string $pubicKeyPath 公钥路径
         * @return void
         */
        public function setPublicKeyPath($pubicKeyPath)
        {
            $publicKey = file_get_contents($pubicKeyPath);
    
            $this->setPublicKey($publicKey);
        }
    
        /**
         * 设置私钥
         *
         * 注意:PHP使用的是RSA原始私钥而不是PKCS8格式的私钥
         *
         * @param  string $privateKey 私钥
         * @param  string $passphrase 私钥密码
         * @return void
         */
        public function setPrivateKey($privateKey, $passphrase = '')
        {
            if (strpos($privateKey, 'BEGIN RSA PRIVATE KEY') === FALSE)
            {
                $privateKey = chunk_split($privateKey, 64, "
    ");
                $privateKey = "-----BEGIN RSA PRIVATE KEY-----
    " . $privateKey . "-----END RSA PRIVATE KEY-----
    ";
            }
    
            $this->_privateKey = openssl_pkey_get_private($privateKey, $passphrase);
        }
        
        /**
         * 设置公钥
         *
         * @param  string $publicKey 公钥
         * @return void
         */
        public function setPublicKey($publicKey)
        {
            if (strpos($publicKey, 'BEGIN PUBLIC KEY') === FALSE)
            {
                $publicKey = chunk_split($publicKey, 64, "
    ");
                $publicKey = "-----BEGIN PUBLIC KEY-----
    " . $publicKey . "-----END PUBLIC KEY-----
    ";
            }
    
            $this->_publicKey = openssl_pkey_get_public($publicKey);
        }
        
        /**
         * 私钥加密字符串
         *
         * @param  string  $string  待加密的字符串
         * @param  integer $padding 填充方式
         * @return string
         */
        public function privateEncrypt($string, $padding = OPENSSL_PKCS1_PADDING)
        {
            $crypted = '';
            $result  = openssl_private_encrypt($string, $crypted, $this->_privateKey, $padding);
            if ($result)
            {
                $crypted = base64_encode($crypted);
            }
    
            return $crypted;
        }
        
        /**
         * 公钥解密私钥加密的字符串
         *
         * @param  string  $crypted 待解密的字符串
         * @param  integer $padding 填充方式
         * @return string
         */
        public function publicDecrypt($crypted, $padding = OPENSSL_PKCS1_PADDING)
        {
            $decrypted = '';
            $crypted   = base64_decode($crypted);
            $result    = openssl_public_decrypt($crypted, $decrypted, $this->_publicKey, $padding);
    
            return $decrypted;
        }
        
        /**
         * 公钥加密字符串
         * 
         * @param  string  $string 待加密的字符串
         * @param  integer $padding 填充方式
         * @return string
         */
        public function publicEncrypt($string, $padding = OPENSSL_PKCS1_PADDING)
        {
            $crypted = '';
            $result  = openssl_public_encrypt($string, $crypted, $this->_publicKey, $padding);
            if ($result)
            {
                $crypted = base64_encode($crypted);
            }
    
            return $crypted;
        }
    
        /**
         * 私钥解密公钥加密的字符串
         *
         * @param  string  $crypted 待解密的字符串
         * @param  integer $padding 填充方式
         * @return string
         */
        public function privateDecrypt($crypted, $padding = OPENSSL_PKCS1_PADDING)
        {
            $decrypted = '';
            $crypted   = base64_decode($crypted);
            $result    = openssl_private_decrypt($crypted, $decrypted, $this->_privateKey, $padding);
    
            return $decrypted;
        }
        
        /**
         * 私钥签名
         * 
         * @param  string  $string 待签名的字符串
         * @param  integer $algo   签名算法
         * @return string
         */
        public function sign($string, $algo = OPENSSL_ALGO_SHA1)
        {
            $signature = '';
    
            $result = openssl_sign($string, $signature, $this->_privateKey, $algo);
            if ($result)
            {
                $signature = base64_encode($signature);
            }
    
            return $signature;
        }
        
        /**
         * 公钥验证签名
         * 
         * @param  string  $string       待验证的字符串
         * @param  string  $signature 字符串的签名
         * @param  integer $algo         签名算法
         * @return boolean
         */
        public function verify($string, $signature, $algo = OPENSSL_ALGO_SHA1)
        {
            $signature = base64_decode($signature);
            $result    = openssl_verify($string, $signature, $this->_publicKey, $algo);
    
            // 1=正确 0=不正确 -1=错误
            if ($result == 1)
            {
                return TRUE;
            }
    
            return FALSE;
        }
        
        /**
         * 在析构函数中释放资源
         */
        public function __destruct()
        {
            if (is_resource($this->_privateKey))
            {
                openssl_free_key($this->_privateKey);
            }
    
            if (is_resource($this->_publicKey))
            {
                openssl_free_key($this->_publicKey);
            }
        }
    }
  • 相关阅读:
    BZOJ 2120 数颜色
    BZOJ 3289 Mato的文件管理
    BZOJ 2038 小Z的袜子
    BZOJ 1878 HH的项链
    洛谷P2709 小B的询问
    6491: Daydream
    问题 L: An Invisible Hand
    HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
    (POJ-3279)Fliptile (dfs经典---也可以枚举)
    问题 J: Palindromic Password ( 2018组队训练赛第十五场) (简单模拟)
  • 原文地址:https://www.cnblogs.com/Athrun/p/php_rsa.html
Copyright © 2011-2022 走看看