美文网首页
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

來源:简书

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

相关文章

  • 把依赖jar 的Java文件,合并到jar包中,重新打包jar

    需求: php 后台对接另一个java 后台接口,需要一个加密算法但是php语言不支持这个加密算法(后台开发这样...

  • PHP加密算法

    加密技术的重点是加密算法,加密算法主要分为三类: 对称加密 非对称加密 不可逆加密 对称加密算法 加密过程: 将明...

  • PHP加密算法

    加密概要 在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只...

  • PHP对称加密-AES

    对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于...

  • 关于AES加密

    以下为本人亲测的加密算法(包含PHP、iOS、JAVA以及微信小程序之间的加解密) 一、PHP 运行结果 二、iO...

  • PHP实现非对称加密

    内容来源(公众号:PHP基础入门教程)对称加密算法在加密和解密时使用的是同一个密钥。与对称加密算法不同,非对称加密...

  • php AES加密算法

    Advanced Encryption Standard高级加密标准 ,简称AES加密算法,用来代替DES...

  • PHP AES对称加密算法

    利用php加密库 mcrypt 进行AES加密解密 在ThinkPHP3.2中的使用方法 把加密类放在第三方类库目...

  • PHP的几种加密算法

    前言 PHP加密方式分为单项散列加密,对称加密,非对称加密这几类。像常用的MD5、hash、crypt、sha1这...

  • 【记录】Linux 开启 php 的 openssl扩展

    php 版本升级到7.1.3后,发现 mcrypt加密算法不能用了。推荐的替代方案就是openssl,现记录一下其...

网友评论

      本文标题:PHP加密算法

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