zoukankan      html  css  js  c++  java
  • PHP加密解密

    PHP加密解密

    对称加密

    采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
    在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。
    AES加密算法
    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
    PHP的OpenSSL扩展已经实现了AES加密算法,我们可以通过OpenSSL扩展提供的方法实现对数据的加密和解密,PHP在7.2版本已经完全移除了MCrypt加密,PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.PHP AES实现
    PHP实现代码:

    class AES
    {
        //设置AES秘钥
        private static $aes_key = 'bUYJ3nTV6VBasdJF'; //此处填写前后端共同约定的秘钥
    
        /**
         * 加密
         * @param string $str    要加密的数据
         * @return bool|string   加密后的数据
         */
        static public function encrypt($str) {
    
            $data = openssl_encrypt($str, 'AES-128-ECB', self::$aes_key, OPENSSL_RAW_DATA);
            $data = base64_encode($data);
    
            return $data;
        }
    
        /**
         * 解密
         * @param string $str    要解密的数据
         * @return string        解密后的数据
         */
        static public function decrypt($str) {
    
            $decrypted = openssl_decrypt(base64_decode($str), 'AES-128-ECB', self::$aes_key, OPENSSL_RAW_DATA);
            return $decrypted;
        }
    
    
    }
    

    非对称加密

    对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
    在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
    RSA加密算法
    RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
    解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。
    以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进行解码了。以上就是RSA算法的工作流程。
    算法实现过程为:
    随意选择两个大的质数p和q,p不等于q,计算N=pq。
    根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。
    选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
    用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。
    将p和q的记录销毁。
    以上内容中,(N,e)是公钥,(N,d)是私钥。
    生成私钥和公钥
    生成私钥文件:
    openssl genrsa -out rsa_private_key.pem 1024
    利用私钥,生成公钥:
    openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
    通过生成的公钥和私钥就可以对数据进行加解密:
    PHP RSA 实现
    PHP实现代码(公钥加密私钥解密):

    class RSA
    {
        /**
         * @param string $str 要加密的数据
         * @param string $public_key 公钥
         * @return string
         */
        static public function encrypt($str, $public_key) {
    
            $encrypted = '';
            $pu_key = openssl_pkey_get_public($public_key);
            openssl_public_encrypt($str, $encrypted, $pu_key);//公钥加密
    
            $encrypted = base64_encode($encrypted);
    
            return $encrypted;
        }
    
        /**
         * 解密
         * @param string $str 要解密的数据
         * @param string $private_key 私钥
         * @return string
         */
        static public function decrypt($str, $private_key) {
    
            $decrypted = '';
            $pi_key =  openssl_pkey_get_private($private_key);
            openssl_private_decrypt(base64_decode($str), $decrypted, $pi_key);//私钥解密
    
            return $decrypted;
        }
    }
    

    PHP实现代码(私钥加密公钥解密):

    class RSA
    {
        static public function encrypt($str, private_key) {
    
            $encrypted = '';
            $pi_key = openssl_pkey_get_private($private_key);
            openssl_private_encrypt($data, $encrypted, $pi_key); //私钥加密
            
            $encrypted = base64_encode($encrypted);
            
            return $encrypted;
        }
        
        static public function decrypt($str, $public_key) {
    
            $decrypted = '';
            $pu_key = openssl_pkey_get_public($public_key);
            openssl_public_decrypt(base64_decode($str), $decrypted, $pu_key);//公钥解密
            
            return $decrypted;
        }
    }
    
    
    function en_decrypt($str = '', $aes_key = '', $type = 0) {
        if (empty($type)){
            //加密
            $data = openssl_encrypt($str, 'AES-128-ECB', $aes_key, OPENSSL_RAW_DATA);
            $data = base64_encode($data);
        }else{
            //解密
            $data = openssl_decrypt(base64_decode($str), 'AES-128-ECB', $aes_key, OPENSSL_RAW_DATA);
        }
        return $data;
    }
  • 相关阅读:
    【DOM编程艺术】positionMessage函数和moveMessage函数
    Javascript中setTimeout和setInterval的区别和使用
    添加数据时候获取自增的ID
    字符串入门 大纲
    字符串入门练习题10 星球语言的翻译 题解
    字符串入门练习题9 聊天室 题解
    字符串入门练习题8 大小写转换密码锁 题解
    字符串入门练习题7 男孩或者女孩 题解
    字符串入门练习题6 字符串加密 题解
    字符串入门练习题5 有用的数学 题解
  • 原文地址:https://www.cnblogs.com/wangyuyanhello/p/13784577.html
Copyright © 2011-2022 走看看