美文网首页
PHP加密算法

PHP加密算法

作者: 飞越_7666 | 来源:发表于2018-10-09 10:22 被阅读0次

    加密技术的重点是加密算法,加密算法主要分为三类:

    对称加密

    非对称加密

    不可逆加密

    对称加密算法

    加密过程:

    将明文分成N个组,然后对各个组进行加密,形成各自的密文,最后把所有的分组密文进行合并,形成最终的密文。

    优点:

    算法公开、计算量小、加密速度快、加密效率高

    缺点:

    交易双方都使用同样钥匙,安全性得不到保证

    密钥管理困难,尤其是在分布式网络中

    常用算法:

    DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish

    PHP中对称加密算法

    $cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表$mode_list = mcrypt_list_modes();//mcrypt支持的加密模式列表// print_r($cipher_list);// print_r($mode_list);functionencrypt($key,$data){    $td = mcrypt_module_open("des","","ecb","");//使用MCRYPT_DES算法,ecb模式$size = mcrypt_enc_get_iv_size($td);//设置初始向量的大小$iv = mcrypt_create_iv($size,MCRYPT_RAND);//创建初始向量$key_size = mcrypt_enc_get_key_size($td);//返回所支持的最大的密钥长度(以字节计算)$salt ='';    $subkey = substr(md5(md5($key).$salt),0,$key_size);//对key复杂处理,并设置长度mcrypt_generic_init($td, $subkey, $iv);    $endata = mcrypt_generic($td, $data);    mcrypt_generic_deinit($td);    mcrypt_module_close($td);return$endata;}functiondecrypt($key,$endata){    $td = mcrypt_module_open("des","","ecb","");//使用MCRYPT_DES算法,ecb模式$size = mcrypt_enc_get_iv_size($td);//设置初始向量的大小$iv = mcrypt_create_iv($size,MCRYPT_RAND);//创建初始向量$key_size = mcrypt_enc_get_key_size($td);//返回所支持的最大的密钥长度(以字节计算)$salt ='';    $subkey = substr(md5(md5($key).$salt),0,$key_size);//对key复杂处理,并设置长度mcrypt_generic_init($td, $subkey, $iv);    $data = rtrim(mdecrypt_generic($td, $endata)).'\n';    mcrypt_generic_deinit($td);    mcrypt_module_close($td);return$data;}$key ="www.tencent.com";// $data = "返回所支持的最大的密钥长度(涉及到发件费啦";$data ="dadfafdafd,我是一个好孩子";$endata =  encrypt($key,$data);$data1 = decrypt($key,$endata);echo$endata;//直接输出,在网页上是乱码,用base64_encode处理,就变成由字符、数组、加号、斜杠等共64种字符注册echobase64_encode($endata);echo$data1;

    非对称加密算法

    使用过程:

    乙方生成两把密钥(公钥和私钥)

    甲方获取乙方的公钥,然后用它对信息加密。

    乙方得到加密后的信息,用私钥解密,乙方也可用私钥加密字符串

    甲方获取乙方私钥加密数据,用公钥解密

    优点:

    更安全,密钥越长,它就越难破解

    缺点:

    加密速度慢

    常用算法:

    RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

    RSA算法

    <?php/**

    * 使用openssl实现非对称加密

    */classRsa{/**

        * private key

        */private$_privKey;/**

        * public key

        */private$_pubKey;/**

        * the keys saving path

        */private$_keyPath;/**

        * the construtor,the param $path is the keys saving path

        */publicfunction__construct($path){if(empty($path) || !is_dir($path)) {thrownewException('Must set the keys save path');        }$this->_keyPath = $path;    }/**

        * create the key pair,save the key to $this->_keyPath

        * 也可以使用openssl命令生成公钥私钥

        *  openssl genrsa -out rsa_private_key.pem 1024

        *  openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

        */publicfunctioncreateKey(){        $r = openssl_pkey_new();        openssl_pkey_export($r, $privKey);        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR .'priv.key', $privKey);$this->_privKey = openssl_pkey_get_public($privKey);        $rp = openssl_pkey_get_details($r);        $pubKey = $rp['key'];        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR .'pub.key', $pubKey);$this->_pubKey = openssl_pkey_get_public($pubKey);    }/**

        * setup the private key

        */publicfunctionsetupPrivKey(){if(is_resource($this->_privKey)) {returntrue;        }        $file =$this->_keyPath . DIRECTORY_SEPARATOR .'priv.key';        $prk = file_get_contents($file);$this->_privKey = openssl_pkey_get_private($prk);returntrue;    }/**

        * setup the public key

        */publicfunctionsetupPubKey(){if(is_resource($this->_pubKey)) {returntrue;        }        $file =$this->_keyPath . DIRECTORY_SEPARATOR .'pub.key';        $puk = file_get_contents($file);$this->_pubKey = openssl_pkey_get_public($puk);returntrue;    }/**

        * encrypt with the private key

        */publicfunctionprivEncrypt($data){if(!is_string($data)) {returnnull;        }$this->setupPrivKey();        $r = openssl_private_encrypt($data, $encrypted,$this->_privKey);if($r) {returnbase64_encode($encrypted);        }returnnull;    }/**

        * decrypt with the private key

        */publicfunctionprivDecrypt($encrypted){if(!is_string($encrypted)) {returnnull;        }$this->setupPrivKey();        $encrypted = base64_decode($encrypted);        $r = openssl_private_decrypt($encrypted, $decrypted,$this->_privKey);if($r) {return$decrypted;        }returnnull;    }/**

        * encrypt with public key

        */publicfunctionpubEncrypt($data){if(!is_string($data)) {returnnull;        }$this->setupPubKey();        $r = openssl_public_encrypt($data, $encrypted,$this->_pubKey);if($r) {returnbase64_encode($encrypted);        }returnnull;    }/**

        * decrypt with the public key

        */publicfunctionpubDecrypt($crypted){if(!is_string($crypted)) {returnnull;        }$this->setupPubKey();        $crypted = base64_decode($crypted);        $r = openssl_public_decrypt($crypted, $decrypted,$this->_pubKey);if($r) {return$decrypted;        }returnnull;    }publicfunction__destruct(){        @fclose($this->_privKey);        @fclose($this->_pubKey);    }}//以下是一个简单的测试demo,如果不需要请删除$rsa =newRsa('ssl-key');//私钥加密,公钥解密echo'source:我是老鳖<br />';$pre = $rsa->privEncrypt('我是老鳖');echo'private encrypted:<br />'. $pre .'<br />';$pud = $rsa->pubDecrypt($pre);echo'public decrypted:'. $pud .'<br />';//公钥加密,私钥解密echo'source:干IT的<br />';$pue = $rsa->pubEncrypt('干IT的');echo'public encrypt:<br />'. $pue .'<br />';$prd = $rsa->privDecrypt($pue);echo'private decrypt:'. $prd;?>

    不可逆加密算法

    加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。

    常用算法有  md5, crypt,sha1

    md5

    <?php$data ='hello';echomd5($data);//输出32位的16进制 5d41402abc4b2a76b9719d911017c592

    crypt

    //以不同散列类型使用 crypt()以上输出Standard DES: rl.3StKT.4T8MExtended DES: _J9..rasmBYk8r9AiWNcMD5:$1$rasmusle$rISCgZzpwk3UhDidwXvin0Blowfish:$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hiSHA-256:$5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6SHA-512:$6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

    sha1

    <?php$data="hello";echosha1($data);// aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d//当然,可以将多种加密算法混合使用echomd5(sha1($data));//输出:e69d7e620e82be5eb414d1f8d1d4b9d9//这种方式的双重加密也可以提高数据的安全性

    作者:柳浪闻笛

    链接:https://www.jianshu.com/p/d10afbbb92e3

    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:PHP加密算法

          本文链接:https://www.haomeiwen.com/subject/whheaftx.html