PHP加密算法

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

对称加密

非对称加密

不可逆加密

对称加密算法

加密过程:

将明文分成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

來源:简书

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 加密概要 在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只...
    Gundy_阅读 609评论 2 9
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,894评论 0 7
  • 一、Discuz中的加密解密函数---authcode 函数解释: $string:字符串,明文或密文$opera...
    Uzero阅读 1,406评论 0 1
  • 几根旧钢管,两张废铁皮,花了好几百大元做的铁皮打孔字,请电焊小弟捣鼓出来这么个破玩意,权叫做门头吧,马峰问我:...
    守夜人雪诺阅读 442评论 0 0
  • “佛说,前世五百次的回眸,才换来今生的一次擦肩而过。”所以前世的我定回眸张望了无数个“五百次”,方得以在今生与她来...
    莫负青柠阅读 435评论 0 0