手机版

PHP中的各种加密技术及代码示例分析

时间:2021-09-14 来源:互联网 编辑:宝哥软件园 浏览:

对称加密(也称为私钥加密)是指使用相同密钥进行加密和解密的加密算法。有时称为传统密码算法,即加密密钥可以从解密密钥中推导出来,解密密钥也可以从加密密钥中推导出来。在大多数对称算法中,加密密钥和解密密钥是相同的,因此这种加密算法也被称为密钥算法或单密钥算法。

信息加密技术的分类

单一散列加密技术(不可逆加密)

它属于抽象算法,不是加密算法,是将任意长输入字符串变成固定长输出字符串的函数

讯息摘要5

string md5 (string $str [,bool $ raw _ output=false]);//MD5加密,输入任意长度的字符串以返回唯一的32位字符

Md5()是没有反向解密算法的单向加密,但是一些常见的字符串可以通过收集、枚举和碰撞来破解。所以为了让破解更麻烦,我们一般加一点盐,双MD5

md5(md5($password)。sdva’);

Sdva是盐值,应该是随机的。比如密码加密经常用到md5,所以我在注册的时候会随机生成这个字符串,然后通过上面的方法进行双重加密;

地窖

很少看到有人使用这个功能。如果你想使用它,它可以用于对称或非对称算法。你能理解;

String crypt (string $ str [,string $ salt])//第一个是要加密的字符串,第二个是salt值(即加密干扰值,如果不提供,默认由PHP自动生成);返回散列字符串或少于13个字符的字符串,用于区分salt值

?php $ password=' testtest.comecho crypt($密码);//Output : $ 1 $ dz3 . qx2 . $ cqz8i . ofeeppkyrwp0og 8 L1/*第二个$和第三个$之间的八个字符是由PHP生成的,每次刷新都会改变一次*/echo ' HR ';echo crypt($password,' test test ');//输出:tesgeyalk m3a//当我们想要添加一个用户自定义的salt值时,就像例子中那样,直接添加testtest作为第二个参数,超过两个字符就会截取前两个echo‘HR’;echo crypt($password,' $ 1 $ test test $ ');//输出:$ 1 $ test test $ dsirawgthivh3o 0 HSH gol 1/* Crypt加密功能有多种盐值加密支持。上面的示例将MD5哈希显示为盐值。这样,盐的价值以1美元的形式增加。例如,test test被添加在最后两个$字符之间。如果超过八个字符,前八位将被截取,总长度为12位。这是默认的地穴形式。*/echo“HR”;//crypt还支持多种salt加密,详见Sha1加密手册:string sha1 (string $ str [,bool $ raw _ output=false]);//与md5类似,不同的是sha1()默认返回40个字符的哈希值,传入参数的属性相同。第一个是加密字符串,第二个是raw_output的布尔值,默认值为false。如果设置为true,sha1()将以原始格式返回原始的20位消息摘要。php $my_intro='周小刚';echo sha1($ my _ intro);//b 6773 e 8 c 180 c 693d 9 f 875 BCF 77 c 1202 a 243 e 8594回声' HR ';//当然可以混合多种加密算法使用echo MD5(sha1($ my _ intro));//输出:54818 BD 624d 69 AC 9a 139 BF 92251 e 381d//这样的双重加密也可以提高数据安全性和非对称加密

非对称加密算法需要两个密钥进行加密和解密,即公钥和私钥。

如图所示,甲乙双方采用非对称加密,完成重要信息的安全传输。

乙方生成一对密钥(公钥和私钥),并将公钥透露给其他方。获得该公钥的甲方在将机密信息发送给乙方之前,使用该密钥对其进行加密.乙方用自己保存的另一个私钥(私钥)对加密信息进行解密。乙方只能使用其私钥对相应公钥加密的信息进行解密。在传输过程中,即使攻击者截获了传输的密文并获得了B的公钥,他也无法破解密文,因为只有B的私钥才能解密密文

同样,如果B想回复A加密的信息,那么A需要向B公布A的公钥进行加密,A保留A的私钥进行解密。

非对称加密中使用的主要算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。我们看到最多的算法是RSA算法

以下是摘自互联网的PHP的非对称加密算法通过openssl

?php /** *使用openssl实现非对称加密* @自2010-07-08 */类Rsa { /** *私钥*/private $ _ privKey;/** *公钥*/私钥$ _ pubKey/** *密钥保存路径*/private $ _ KeyPath;/* * *构造函数,param $路径是密钥保存路径*/public function _ _ construct($ path){ if(emptyempty($ path)| |!is _ dir($ path)){ 0抛出新异常('必须设置密钥保存路径');} $ this-_ KeyPath=$ path;} /** *创建密钥对,将密钥保存到$this-_keyPath */public函数create KeY(){ $ r=Openssl _ pkey _ new();openssl_pkey_export($r,$ privKey);file _ put _ contents($ this-_ Keypath .目录分隔符.priv.key ',$ privKey);$ this-_ privKey=open SSL _ pkey _ get _ public($ privKey);$ RP=open SSL _ pkey _ get _ details($ r);$ PubKey=$ RP[' key '];file _ put _ contents($ this-_ Keypath .目录分隔符.pub.key ',$ PubKey);$ this-_ PubKey=open SSL _ pkey _ get _ public($ PubKey);} /** *设置私钥*/公钥函数setupprivKey(){ if(is _ resource($ this-_ privKey)){ return true;} $file=$this-_keyPath .目录分隔符.个人的密钥';$ PRK=file _ get _ contents($ file);$ this-_ privKey=open SSL _ pkey _ get _ private($ PRK);返回真;} /** *设置公钥*/公共函数setupPubKey(){ if(is _ resource($ this-_ PubKey)){ return true;} $file=$this-_keyPath .目录分隔符.出版密钥';$ puk=file _ get _ contents($ file);$ this-_ PubKey=Openssl _ pkey _ get _ public($ puk);返回真;} /** *用私钥加密*/公共函数priverify($ data){ if(!is _ string($ data)){ 0返回null } $ this-setupprivKey();$ r=open SSL _ private _ encrypt($ data,$encrypted,$ this-_ privKey);if($ r){ return base64 _ encode($ encrypted);}返回null} /** *使用私钥*/公共函数privDecrypt($encrypted) { if(!is _ string($加密)){ 0返回null } $ this-setupprivKey();$ encrypted=base64 _ decode($ encrypted);$ r=打开SSL _ private _ decrypt($加密,$解密,$ this-_ privKey);if($ r){ return $ decrypted;}返回null} /** *用公钥加密*/公共函数pubEncrypt($data) { if(!is _ string($ data)){ 0返回null } $ this-SetupPubKey();$ r=open SSL _ public _ encrypt($ data,$encrypted,$ this-_ PubKey);if($ r){ return base64 _ encode($ encrypted);}返回null} /** *使用公钥*/公共函数PubDerypt($ crypted){ if(!is _ string($ crypted)){ 0返回null } $ this-SetupPubKey();$ crypted=base64 _ decode($ crypted);$ r=open SSL _ public _ decrypt($ crypted,$decrypted,$ this-_ PubKey);if($ r){ return $ decrypted;}返回null } public function _ _ destrust(){ @ fc lost($ this-_ privKey);@ fc lost($ this-_ PubKey);} } //以下是一个简单的测试演示,如果不需要请删除$rsa=新的RSa(' SSL-key ');//私钥加密,公钥解密"回声"来源:我是老鳖br/';$pre=$rsa-privEncrypt('我是老鳖');echo“私人加密: br/.$pre .br/';$ pud=$ RSA-PubDecrypt($ pre);“回声”公开解密:$布丁br/';//公钥加密,私钥解密回声源:干信息技术的br/';$pue=$rsa-pubEncrypt('干信息技术的');回声“公共加密: br/.$pue .br/';$ prd=$ RSA-priv decrypt($ PUE);回声"私有解密程序:"。$珠三角;对称加密算法

对称加密(也称为私钥加密)是指使用相同密钥进行加密和解密的加密算法。有时称为传统密码算法,即加密密钥可以从解密密钥中推导出来,解密密钥也可以从加密密钥中推导出来。在大多数对称算法中,加密密钥和解密密钥是相同的,因此这种加密算法也被称为密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前就密钥达成一致。对称算法的安全性取决于密钥。泄露密钥意味着任何人都可以解密他们发送或接收的消息,因此密钥的保密性对于通信非常重要。

常用的对称加密算法包括: DES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法和IDEA算法。

PHP中也有封装的对称加密函数

Urlencode/urldecode字符串Urlencode(字符串$ str)/* 1。一个参数,传入要加密的字符串(通常用于加密URL) 2。urlencode是双向加密,可以通过urldecode进行加密(严格来说,并不是真正的加密。更像是一种编码方法)3。返回一个字符串,其中除了-_,所有非字母数字字符。将被数百个分号(%)替换,后跟两个十六进制数字,空格将被编码为加号()。*/通过Urlencode函数:解决链接中字符引起的问题

?PHP $ pre _ URL _ encode=' Zhou gang.com?username=Zhou gang password=Zhou ';//在实际开发中,我们经常要构造这种URL,这是没有问题的。$url_decode='zhougang.com?username=Zhou gang password=Zhou ';//但是在这种情况下,用$_GET()接受会产生问题。/* array([username]=Zhou[gang]=[password]=Zhou)*///解决问题如下: $username='周刚';$url_decode='zhougang.com?用户名='。urlencode($username)。密码=Zhou ';urlencode()的常用转换字符?=?====%=%=& \=\ base64 string base64 _ decode(string $ encoded _ data)base64 _ encode()接受一个参数,也就是要编码的数据(这里不使用string,因为base64常用来编码图片,base64 _ encode()是双向加密,base64 _ decode()可以用来解密$ data=file _ get _ contents($ filename)。echo base64 _ encode($ data);/*然后可以通过检查网页的源代码得到一串base64字符串,然后用base64_decode()还原得到图片。这也可以作为移动终端上传图片的处理方案之一(但不推荐)*/?严格来说,这两个函数不是加密,而是一种格式的序列化

以下是我们的PHP程序中常用的对称加密算法

Discuz经典算法

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)函数authcode($string,$operation='DECODE ',$key=' ',$ expire=0){//动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙$ ckey _ length=4;//密匙$key=md5($key?$ key : $ GLOBALS[' discuz _ auth _ key ']);//密匙a会参与加解密$keya=md5(substr($key,0,16));//密匙b会用来做数据完整性验证$keyb=md5(substr($key,16,16));//密匙c用于变化生成的密文$ keyc=$ ckey _ length?($operation=='DECODE '?substr($string,0,$ ckey _ length): substr(MD5(microtime()),-$ ckey _ length)): " ";//参与运算的密匙$cryptkey=$keya.md5($keya .$ key k);$ key _ length=strlen($ crypt key);//明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),//解密时会通过这个密匙验证数据完整性//如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存动态密匙,以保证解密正确$string=$operation=='DECODE '?base64_decode(substr($string,$ ckey _ length)): sprintf('0d',$过期?$到期时间(): 0)。substr(md5($string .$keyb),0,16).$ string $ string _ length=strlen($ string);$ result=$box=范围(0,255);$ rnd key=array();//产生密匙簿对于($ I=0;$ I=255 $ I){ $ rnd key[$ I]=order($ crypt key[$ I % $ key _ length]);} //用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度for($ j=$ I=0;$ I 256 $ I){ $ j=($ j $ box[$ I]$ rnd key[$ I])% 256;$ tmp=$ box[$ I];$ box[$ I]=$ box[$ j];$ box[$ j]=$ tmp;} //核心加解密部分for($ a=$ j=$ I=0;一美元字符串_长度;$ I){ $ a=($ a 1)% 256;$ j=($ j $ box[$ a])% 256;$ tmp=$ box[$ a];$ box[$ a]=$ box[$ j];$ box[$ j]=$ tmp;//从密匙簿得出密匙进行异或,再转成字符$结果=chr(order($ string[$ i])^(box[($盒[$ a]$盒[$ j])% 256]);} if($operation=='DECODE') { //验证数据有效性,请看未加密明文的格式if((substr($result,0,10)==0 || substr($result,0,10) - time() 0) substr($result,10,16)==substr(MD5)(substr($ result,26).$keyb),0,16)){ 0返回substr($result,26);} else { return} } else { //把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因//因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码返回$ key。str _ replace('=','',base64 _ encode($ result));} } 加解密函数加密()

?php //$string:需要加密解密的字符串;$操作:判断是加密还是解密,E表示加密,D表示解密;$key:密匙函数encrypt($string,$operation,$ key=' '){ $ key=MD5($ key);$ key _ length=strlen($ key);$string=$operation=='D '?base64 _ decode($ string): substr(MD5($ string .$key),0,8).$ string $ string _ length=strlen($ string);$ rnd键=$ box=array();$ result=for($ I=0;$ I=255 $ I){ $ rnd key[$ I]=order($ key[$ I % $ key _ length]);$ box[$ I]=$ I;} for($ j=$ I=0;$ i256 $ I){ $ j=($ j $ box[$ I]$ rnd key[$ I])% 6;$ tmp=$ box[$ I];$ box[$ I]=$ box[$ j];$ box[$ j]=$ tmp;} for($ a=$ j=$ I=0;一美元字符串_长度;$ I){ $ a=($ a 1)% 6;$ j=($ j $ box[$ a])% 6;$ tmp=$ box[$ a];$ box[$ a]=$ box[$ j];$ box[$ j]=$ tmp;$结果。=chr(ord($string[$i])^($box[($box[$a]$盒[$ j])% 6]);} if($ operation==' D '){ if(substr($ result,0,8)==substr(MD5)(substr($ result,8)).$key),0,8)){ return substr($result,8);} else { return} }else{ return str_replace('=','',base64 _ encode($ result));} } ?感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

版权声明:PHP中的各种加密技术及代码示例分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。