宝哥软件园

PHP对称加密功能实现数据加解密

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

项目中有一个地方将用户ID加密后传输给下一个联系人进行反解。(原谅我没有透露太多-_-!),第一个想到的是康生的一个函数。后来搜索了一下,在简洁魔法中找到了一个简单的方法,然后整合起来形成自己的功能。

首先,对称加密

发送方使用密钥和算法将明文处理成密文,接收方使用密钥和算法将密文处理成明文。发送方和接收方使用相同的密钥来加密和解密数据。

由于加密和解密使用相同的密钥,因此安全性不仅与算法有关,而且对密钥的安全性也很重要。

当然,钥匙越复杂越好。相反,密钥通常较小,因为虽然密钥越大,加密越强,但加密和解密过程越慢,所以密钥的大小应该兼顾安全性和效率。

毕竟,对称加密算法具有算法开放、计算量小、加密速度快、加密效率高的特点。没有效率高的优势,不如直接使用非对称加密。

此外,每对用户在使用对称加密算法时都需要使用一个别人不知道的唯一密钥,这将使发送方和接收方拥有的密钥数量呈几何级增长,密钥管理成为用户的负担。

对称加密算法在分布式网络系统中很难使用,主要是因为密钥管理困难和成本高。

第二,非对称加密

非对称加密安全得多。它使用一对密钥,公钥和私钥,分别用于加密和解密。私钥只能由一方安全保管,不能泄露,而公钥可以发送给任何需要的人。

最常见的非对称加密是银行系统和支付平台。比如我们在申请支付宝或者银联支付接口的时候,会得到一个公钥。在商城进行支付时,我们会用公钥对信息进行加密,提交给平台。平台将使用密钥解密您的信息并执行支付操作。

虽然非对称加密是安全的,但是与对称加密相比,它非常慢,所以我们通常使用对称加密来传输消息,但是我们可以通过非对称加密来发送对称加密中使用的密钥。回头看你申请的支付界面,有没有拿到一对钥匙?^

第三,组合使用

对称加密速度快,最好发送大量数据。非对称加解密耗时长,速度慢,只适合加密少量数据。然而,非对称加密极其安全。

优缺点:对称加密密钥用非对称加密公钥加密,然后发出去。接收方用私钥解密,得到对称加密密钥,然后双方可以使用对称加密进行通信。

项目中使用的方法不应披露。这里只列出了另外两个例子。第一个是在ucenter,第二个是在简明魔术。

应该注意的是,由于base64算法,可能会出现在加密字符串中。如果在url中使用它,它是不友好的,并且可以从外部或者通过递归地改变方法和常规验证来检索它。

/** * 字符串加密以及解密函数* @param string $string原文或者密文* @param字符串$操作操作(ENCODE | DECODE),默认为DECODE * @param字符串$key密钥* @ param int $到期密文有效期,加密时候有效,单位秒,0 为永久有效* @返回字符串处理后的原文或者经过base64_encode处理后的密文*/function _authcode ($string,$operation='DECODE ',$key='Ruesin ',$ expire=0){ $ ckey _ length=4;$ key=MD5($ key);$keya=md5(substr($key,0,16));$keyb=md5(substr($key,16,16));$ 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);$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 { return $ keyc .str_replace('=','',base64 _ encode($ result));}}/*********************************************************************函数名称:加密函数作用:加密解密字符串使用方法:加密:encrypt('str ',' E ',' nowamagic ');解密:encrypt('被加密过的字符串,‘D’,‘nowamagic’);参数说明:美元字符串:需要加密解密的字符串$operation:判断是加密还是解密: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));}}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+