zoukankan      html  css  js  c++  java
  • php中加密和解密

    项目要和第三方进行接口对接,所以数据的安全很重要。第一次自己设计并实现,学习记录下

    网上查了很多资料,真的很深奥

    对称加密:

      双方共用一个约定好的密钥进行数据的加密和解密,但是当密匙丢失,数据将有泄露风险。

    实例:

    $input_str = '阿达854aa';
    echo '被加密的字符串:'.$input_str.'<br>';
    $key = '159';
    $iv = '1234567812345678';//须是16位
    $encrypted = openssl_encrypt($input_str, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
    echo '加密后的字符串:'.$encrypted.'<br>';
    $data = base64_encode($encrypted);
    echo '加密编码后的字符串:'.$data.'<br>';
    $de_data = base64_decode($data);
    echo '加密解码后的字符串:'.$de_data.'<br>';
    $decrypted = openssl_decrypt($de_data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
    echo '解密后的字符串:'.$decrypted.'<br>';

      输出:

    被加密的字符串:阿达854aa
    加密后的字符串:���=8�++�-���
    加密编码后的字符串:qqT4PTiJKyv/LRmng4UGBA==
    加密解码后的字符串:���=8�++�-���
    解密后的字符串:阿达854aa

      其中:

    ‘aes-128-cbc’是一种加密方法,可以使用openssl_get_cipher_methods()获取到。$key加密密钥,须和解密密钥一致。$iv密码初始化向量(16位)。

    非对称加密:

      即双方使用不一样的密钥进行加密、解密,也就是公钥、私钥。届时,私钥加密的数据公钥可以解密。但是,公钥加密的数据只有私钥才可以解密。所以只要私钥保存完好,公钥丢失也不会影响数据的安全性。这种方式在网站上很常见,例如https传输

      具体实现:

    首先要生成一对密钥 http://www.bm8.com.cn/webtool/rsa/

    加密解密类库:

    <?php
    
    
    class Rsa {
     
        /**     
         * 获取私钥     
         * @return bool|resource     
         */    
        private static function getPrivateKey() 
        {        
            $abs_path = dirname(__FILE__) . '/rsa_private_key.pem';
            $content = file_get_contents($abs_path);    
            return openssl_pkey_get_private($content);    
        }    
    
        /**     
         * 获取公钥     
         * @return bool|resource     
         */    
        private static function getPublicKey()
        {   
            $abs_path = dirname(__FILE__) . '/rsa_public_key.pem';
            $content = file_get_contents($abs_path);    
            return openssl_pkey_get_public($content);     
        }
    
        /**     
         * 私钥加密     
         * @param string $data     
         * @return null|string     
         */    
        public static function privEncrypt($data = '')    
        {        
            if (!is_string($data)) {            
                return null;       
            }        
            return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;    
        }    
    
        /**     
         * 公钥加密     
         * @param string $data     
         * @return null|string     
         */    
        public static function publicEncrypt($data = '')   
        {        
            if (!is_string($data)) {            
                return null;        
            }        
            return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;    
        }    
    
        /**     
         * 私钥解密     
         * @param string $encrypted     
         * @return null     
         */    
        public static function privDecrypt($encrypted = '')    
        {        
            if (!is_string($encrypted)) {            
                return null;        
            }        
            return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;    
        }    
    
        /**     
         * 公钥解密     
         * @param string $encrypted     
         * @return null     
         */    
        public static function publicDecrypt($encrypted = '')    
        {        
            if (!is_string($encrypted)) {            
                return null;        
            }        
        return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;    
        }
    
    }

    调用demo:

        require_once "Rsa.php";
        $rsa = new Rsa();
        $data['name'] = 'Tom';
        $data['age']  = '20';
        $privEncrypt = $rsa->privEncrypt(json_encode($data));
        echo '私钥加密后:'.$privEncrypt.'<br>';
    
        $publicDecrypt = $rsa->publicDecrypt($privEncrypt);
        echo '公钥解密后:'.$publicDecrypt.'<br>';
    
        $publicEncrypt = $rsa->publicEncrypt(json_encode($data));
        echo '公钥加密后:'.$publicEncrypt.'<br>';
    
        $privDecrypt = $rsa->privDecrypt($publicEncrypt);
        echo '私钥解密后:'.$privDecrypt.'<br>';

      输出:

    私钥加密后:QwOppsd++LHg84d+d4ygfWRnEUFQhO63COVEE860p+U60EpuUBXlOX1W2ogLStNtOKWGfvNux6QETFG/iX8aL3ffWt+kPcxIpmvhCWlhfk6WI89CEaznGiumqgvwN7XMvQvPWs8LpQO9Cbhh5vxxTOJ5fbduzmpcPGQiFWEUzqw=
    公钥解密后:{"name":"Tom","age":"20"}
    公钥加密后:hoAK18Dlh+xrRh1fJHnbNiVYxB/j410MeMcHYP+BLCL4g47iMosPLVnOjzAr+wWMgXW9S8nrs3fsWJ0lkm4l6/BT9c5nBt2DjmE4W8H7shCHPw/fj1Yy3B9t9Z8MUfegxqdSEsROKTQ2hFmsz8oPhMcZRAek7x8qHWBomsUqtBk=
    私钥解密后:{"name":"Tom","age":"20"}

     先这样吧,将项目搞起来,以后再研究吧。先知道原理就可以了,至于具体为什么这么实现的,哈哈,不懂不懂,有心学但没那个力啊,深奥深奥

    推荐几篇不错的加解密博文:

    https://t.ti-node.com/thread/6497068236977209344

    https://t.ti-node.com/thread/6497352274560417793

    https://t.ti-node.com/thread/6497394198361145345

    https://t.ti-node.com/thread/6499999246572322817

  • 相关阅读:
    IP地址和进制转换
    Cisco交换机常见配置
    macOS上的autoreconf错误导致无法安装问题
    LG P5147 随机数生成器
    LG P1879 [USACO06NOV]Corn Fields G
    LG P5017 [NOIP2018]摆渡车
    mysql触发器trigger详解
    MybatisPuls中QueryWrapper的select、update的用法
    @Transactional各属性详解
    Linux如何查看进程、杀死进程、启动进程等常用命令(包括常用的命令,如查看文件,修改文件读写权限、寻找文件等)
  • 原文地址:https://www.cnblogs.com/two-bees/p/10579879.html
Copyright © 2011-2022 走看看