zoukankan      html  css  js  c++  java
  • PHP语言的RSA算法加解密程序

    程序来源是GitHub的PHP RSA 公钥私钥不对称加密

    Rsa.php程序如下:

    <?php
    /**
     * RSA 公钥 私钥加密 解密 尝试
     * @author wang <baobeigou.com>
     */
    class Rsa {
        private $_config;
        function __construct() {
            $rsa_config = array();
            require_once ('rsa.config.php');//配置文件
            if (empty($rsa_config['private_key']) && empty($rsa_config['public_key'])) {
                throw new Exception('请配置公钥或私钥参数');
            }
            $this->_config = $rsa_config;
        }
        /**
         * 私钥加密
         * @param string $data 要加密的数据
         * @return string 加密后的字符串
         */
        public function privateKeyEncode($data) {
            $encrypted = '';
            $this->_needKey(2);
            $private_key = openssl_pkey_get_private($this->_config['private_key']);
            $fstr = array();
            $array_data = $this->_splitEncode($data);//把要加密的信息 base64 encode后 等长放入数组
            foreach ($array_data as $value) {//理论上是可以只加密数组中的第一个元素 其他的不加密 因为只要一个解密不出来 整体也就解密不出来 这里先全部加密
                openssl_private_encrypt($value, $encrypted, $private_key); //私钥加密
                $fstr[] = $encrypted;//对数组中每个加密
            }
            return base64_encode(serialize($fstr));//序列化后base64_encode
        }
        /**
         * 公钥加密
         * @param string $data 要加密的数据
         * @return string 加密后的字符串
         */
        public function publicKeyEncode($data) {
            $encrypted = '';
            $this->_needKey(1);
            $public_key = openssl_pkey_get_public($this->_config['public_key']);
            $fstr = array();
            $array_data = $this->_splitEncode($data);
            foreach ($array_data as $value) {
                openssl_public_encrypt($value, $encrypted, $public_key); //私钥加密
                $fstr[] = $encrypted;
            }
            return base64_encode(serialize($fstr));
        }
        /**
         * 用公钥解密私钥加密内容
         * @param string $data 要解密的数据
         * @return string 解密后的字符串
         */
        public function decodePrivateEncode($data) {
            $decrypted = '';
            $this->_needKey(1);
            $public_key = openssl_pkey_get_public($this->_config['public_key']);
            $array_data = $this->_toArray($data);//数据base64_decode 后 反序列化成数组
            $str = '';
            foreach ($array_data as $value){
                   openssl_public_decrypt($value, $decrypted, $public_key); //私钥加密的内容通过公钥可用解密出来
                   $str .= $decrypted;//对数组中的每个元素解密 并拼接
            }
            return base64_decode($str);//把拼接的数据base64_decode 解密还原
        }
        /**
         * 用私钥解密公钥加密内容 
         * @param string $data  要解密的数据
         * @return string 解密后的字符串
         */
        public function decodePublicEncode($data) {
            $decrypted = '';
            $this->_needKey(2);
            $private_key = openssl_pkey_get_private($this->_config['private_key']);
            $array_data = $this->_toArray($data);
            $str = '';
            foreach ($array_data as $value){
                   openssl_private_decrypt($value, $decrypted, $private_key); //私钥解密
                   $str .= $decrypted;
            }
            return base64_decode($str);
        }
        /**
         * 检查是否 含有所需配置文件
         * @param int 1 公钥 2 私钥
         * @return int 1
         * @throws Exception
         */
        private function _needKey($type) {
            switch ($type) {
                case 1:
                    if (empty($this->_config['public_key'])) {
                        throw new Exception('请配置公钥');
                    }
                    break;
                case 2:
                    if (empty($this->_config['private_key'])) {
                        throw new Exception('请配置私钥');
                    }
                    break;
            }
            return 1;
        }
        /**
         * 
         * @param type $data
         * @return type
         */
        private function _splitEncode($data) {
            $data = base64_encode($data); //加上base_64 encode  便于用于 分组
            $total_lenth = strlen($data);
            $per = 96;// 能整除2 和 3 RSA每次加密不能超过100个
            $dy = $total_lenth % $per;
            $total_block = $dy ? ($total_lenth / $per) : ($total_lenth / $per - 1);
            for ($i = 0; $i < $total_block; $i++) {
                $return[] = substr($data, $i * $per, $per);//把要加密的信息base64 后 按64长分组
            }
            return $return;
        }
        
        /**
         *公钥加密并用 base64 serialize 过的 data
         * @param type $data base64 serialize 过的 data
         */
        private  function _toArray($data){
            $data = base64_decode($data);
            $array_data = unserialize($data);
            if(!is_array($array_data)){
                throw new Exception('数据加密不符');
            }
            return $array_data;
        }
    }
    
    demo.php程序如下:

    <?php
    /**
     * Rsa 加密 解密 demo
     * @author Wang [BBG]
     */
    require_once 'Rsa.php';
    try {
        
        $rsa = new Rsa();
        $str = '宝贝购 BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com BBG baobeigou.com 宝贝购BBG ';
    //私钥加密
        $data = $rsa->privateKeyEncode($str);
        echo $data . '<br><br><br>';
    //公钥解密
        $decode = $rsa->decodePrivateEncode($data);
        echo $decode . '<br><br><br>';
    //公钥加密
        $pdata = $rsa->publicKeyEncode('Hello World !, 世界 你好!');
        echo $pdata . '<br><br><br>';
    //私钥解密
        $pdecode = $rsa->decodePublicEncode($pdata);
        echo $pdecode . '<br><br><br>';
        
    } catch (Exception $exc) {
        echo $exc->getMessage();
    }


    另外一个值得参考的是GitHub的PHP-RSA



  • 相关阅读:
    php 爬虫采集
    深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!(文末有福利)
    【Nginx】如何格式化日志并推送到远程服务器?看完原来很简单!!
    【Nginx】如何为已安装的Nginx动态添加模块?看完我懂了!!
    【Nginx】如何配置Nginx日志?这是最全面的一篇了!!
    【Nginx】如何按日期分割Nginx日志?看这一篇就够了!!
    【Nginx】如何封禁IP和IP段?看完这篇我会了!!
    【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!
    【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!
    【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564832.html
Copyright © 2011-2022 走看看