程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP加密解密函數參考

PHP加密解密函數參考

編輯:PHP綜合

1.第一種加密解密

  1. // $string 明文 或 密文   
  2. // $isEncrypt 是否加密   
  3. // $key 密匙   
  4. // 采用SHA1生成密匙簿,超過300個字符使用ZLIB壓縮   
  5. function dencrypt($string, $isEncrypt = true, $key = KEY_SPACE) {   
  6.     if (!isset($string{0}) || !isset($key{0})) {   
  7.         return false;   
  8.      }   
  9.        
  10.     $dynKey = $isEncrypt ? hash('sha1', microtime(true)) : substr($string, 0, 40);   
  11.     $fixedKey = hash('sha1', $key);   
  12.        
  13.     $dynKeyPart1 = substr($dynKey, 0, 20);   
  14.     $dynKeyPart2 = substr($dynKey, 20);   
  15.     $fixedKeyPart1 = substr($fixedKey, 0, 20);   
  16.     $fixedKeyPart2 = substr($fixedKey, 20);   
  17.     $key = hash('sha1', $dynKeyPart1 . $fixedKeyPart1 . $dynKeyPart2 . $fixedKeyPart2);   
  18.        
  19.     $string = $isEncrypt ? $fixedKeyPart1 . $string . $dynKeyPart2 : (isset($string{339}) ? gzuncompress(base64_decode(substr($string, 40))) : base64_decode(substr($string, 40)));   
  20.        
  21.     $n = 0;   
  22.     $result = '';   
  23.     $len = strlen($string);   
  24.        
  25.     for ($n = 0; $n < $len; $n++) {   
  26.         $result .= chr(ord($string{$n}) ^ ord($key{$n % 40}));   
  27.      }   
  28.     return $isEncrypt ? $dynKey . str_replace('=', '', base64_encode($n > 299 ? gzcompress($result) : $result)) : substr($result, 20, -20);   
  29. }  

2.第二種加密解密

// 參數解釋   
// $string: 明文 或 密文   
// $Operation:DECODE表示解密,其它表示加密   
// $key: 密匙   
// $expiry:密文有效期   
function authcode($string, $Operation = 'DECODE', $key = '', $expiry = 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.$keyc);   
    $key_length = strlen($cryptkey);   
    // 明文,前10位用來保存時間戳,解密時驗證數據有效性,10到26位用來保存$keyb(密匙b),解密時會通過這個密匙驗證數據完整性   
    // 如果是解碼的話,會從第$ckey_length位開始,因為密文前$ckey_length位保存 動態密匙,以保證解密正確   
    $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') {   
        // substr($result, 0, 10) == 0 驗證數據有效性   
        // substr($result, 0, 10) - time() > 0 驗證數據有效性   
        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 驗證數據完整性   
        // 驗證數據有效性,請看未加密明文的格式   
        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 {   
        // 把動態密匙保存在密文裡,這也是為什麼同樣的明文,生產不同密文後能解密的原因   
        // 因為加密後的密文可能是一些特殊字符,復制過程可能會丟失,所以用base64編碼   
        return $keyc.str_replace('=', '', base64_encode($result));   
     }   
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved