PHP對稱式加密函數實現資料的加密解密_php執行個體

來源:互聯網
上載者:User

項目中有一個地方用到了將使用者ID加密、傳至下個接點進行反解的需求。(原諒我不能透漏太多-_-!),第一個想到的就是康盛Ucenter中的一個函數,後來搜了下,在簡明魔法中也找到了個簡單的方法,遂整合了下,形成了自己使用的函數。

一、對稱式加密

發送方將明文使用密鑰和演算法處理成密文發送出去,接收方使用密鑰和演算法將密文處理成明文,發收信雙方使用同一個金鑰組資料進行加密和解密。

因為使用同一個祕密金鑰加密、解密,所以安全性上不僅與演算法有關,密鑰的安全也很重要。

當然並不是密鑰越複雜越好,相反密鑰通常比較小的,因為雖然密鑰越大,加密越強,但加密與解密的過程越慢,所以密鑰的大小既要照顧到安全性,也要照顧到效率。

畢竟對稱式加密演算法的特點是演算法公開、計算量小、加密速度快、加密效率高,沒了效率高這一優勢,還不如直接用非對稱式加密。

此外,每對使用者每次使用對稱式加密演算法時,都需要使用其他人不知道的惟一鑰匙,這會使得發收信雙方所擁有的鑰匙數量呈幾何級數增長,密鑰管理成為使用者的負擔。

對稱式加密演算法在分布式網路系統上使用較為困難,主要是因為密鑰管理困難,使用成本較高。

二、非對稱式加密

非對稱式加密相對來說,就安全很多了,它使用了一對密鑰,公開密鑰和私人密鑰,分別用來進行加密和解密。私密金鑰只能由一方安全保管,不能外泄,而公開金鑰則可以發給任何請求它的人。

最常見的非對稱式加密,應該就是銀行系統,支付平台了。比如我們申請支付寶或者銀聯支付的介面時,會得到一個公開金鑰,商城中進行支付是,用公開金鑰將資訊加密提交給平台,平台使用金鑰組你的資訊解密,進行支付操作等。

雖然非對稱式加密很安全,但是和對稱式加密比起來,它非常的慢,所以我們一般處理的話,大部分是用對稱式加密來傳送訊息,但對稱式加密所使用的密鑰我們可以通過非對稱式加密的方式發送出去,回想一下你申請到的支付介面,是不是給了你一對密鑰呢?^.^

三、結合使用

對稱性加密速度快,發送大量資料時用比較好。非對稱式加密加密和解密花費時間長、速度慢,只適合對少量資料進行加密,但是,非對稱式加密的安全性是極高的。

揚長避短:將對稱式加密的密鑰使用非對稱式加密的公開金鑰進行加密,然後發送出去,接收方使用私密金鑰進行解密得到對稱式加密的密鑰,然後雙方可以使用對稱式加密來進行溝通。

項目中使用的方法不宜透露,只在這裡列出兩個其他的例子吧。第一個是ucenter中的,第二個是簡明魔法中看到的。

需要注意的是,由於是base64演算法,加密後的字串有可能會出現 + \ ,如果是用在url中,是不友好的,可以在外部或改下方法,正則驗證遞迴調取下。

/** * 字串加密以及解密函數 * @param string $string 原文或者密文 * @param string $operation 操作(ENCODE | DECODE), 預設為 DECODE * @param string $key 密鑰 * @param int $expiry 密文有效期間, 加密時候有效, 單位 秒,0 為永久有效 * @return string 處理後的 原文或者 經過 base64_encode 處理後的密文 */function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 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 . $keyc); $key_length = strlen($cryptkey);  $string = $operation == 'DECODE' ? base64_decode(   substr($string, $ckey_length)) : sprintf('%010d',    $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) .    $string; $string_length = strlen($string);  $result = ''; $box = range(0, 255);  $rndkey = array(); for ($i = 0; $i <= 255; $i ++) {  $rndkey[$i] = ord($cryptkey[$i % $key_length]); }  for ($j = $i = 0; $i < 256; $i ++) {  $j = ($j + $box[$i] + $rndkey[$i]) % 256;  $tmp = $box[$i];  $box[$i] = $box[$j];  $box[$j] = $tmp; }  for ($a = $j = $i = 0; $i < $string_length; $i ++) {  $a = ($a + 1) % 256;  $j = ($j + $box[$a]) % 256;  $tmp = $box[$a];  $box[$a] = $box[$j];  $box[$j] = $tmp;  $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$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)) {   return substr($result, 26);  } else {   return '';  } } else {  return $keyc . str_replace('=', '', base64_encode($result)); }}
/*********************************************************************函數名稱:encrypt函數作用:加密解密字串使用方法:加密  :encrypt('str','E','nowamagic');解密  :encrypt('被加密過的字串','D','nowamagic');參數說明:$string :需要加密解密的字串$operation:判斷是加密還是解密:E:加密 D:解密$key  :加密的鑰匙(密匙);*********************************************************************/function 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); $rndkey=$box=array(); $result=''; for($i=0;$i<=255;$i++) {  $rndkey[$i]=ord($key[$i%$key_length]);  $box[$i]=$i; } for($j=$i=0;$i<256;$i++) {  $j=($j+$box[$i]+$rndkey[$i])%256;  $tmp=$box[$i];  $box[$i]=$box[$j];  $box[$j]=$tmp; } for($a=$j=$i=0;$i<$string_length;$i++) {  $a=($a+1)%256;  $j=($j+$box[$a])%256;  $tmp=$box[$a];  $box[$a]=$box[$j];  $box[$j]=$tmp;  $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); } 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)); }}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.