加密技术的重点是加密算法,加密算法主要分为三类:
对称加密
非对称加密
不可逆加密
对称加密算法
加密过程:
将明文分成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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
网友评论