ホームページ  >  記事  >  バックエンド開発  >  PHP の暗号化関数と復号化関数は、暗号化された文字列と復号化された文字列を生成します。

PHP の暗号化関数と復号化関数は、暗号化された文字列と復号化された文字列を生成します。

墨辰丷
墨辰丷オリジナル
2018-06-11 14:12:482152ブラウズ

PHP の暗号化および復号化関数の共有。1 つは Discuz! の authcode 暗号化関数 (詳細な分解付き)、もう 1 つは encrypt() 関数です。 PHP は、特定の情報を暗号化するために使用する必要があります。つまり、暗号化アルゴリズムによって暗号化された文字列が生成され、プログラムが復号化された情報を処理しやすくするために、この暗号化された文字列を復号化アルゴリズムによって復号化できます。

プロジェクトでは、場合によっては、PHP を使用して特定の情報を暗号化する必要があります。つまり、暗号化アルゴリズムを通じて暗号化された文字列を生成する必要があります。この暗号化された文字列は、プログラムの復号化を容易にする復号化アルゴリズムによって復号化できます。復号化された文字列が処理されます。
最も一般的なアプリケーションは、ユーザー ログインと一部の API データ交換シナリオです。

著者は、いくつかの古典的な PHP 暗号化および復号化関数コードを収集して、皆さんと共有します。暗号化と復号化の原理は、一般に、特定の暗号化と復号化アルゴリズムを使用し、そのアルゴリズムにキーを追加し、最終的に暗号化と復号化の結果を取得することです。

1. 非常に強力な認証コード暗号化関数、Discuz! Classic コード (詳細な説明付き): 関数 authcode($string, $operation, $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 == &#39;DECODE&#39;) { 
    // 验证数据有效性,请看未加密明文的格式  
    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 &#39;&#39;;  
    }  
  } else {  
    // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因  
    // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码  
    return $keyc.str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));  
  }  
}

$string : 文字列、平文または暗号文; $operation: DECODE は復号化を意味し、その他は暗号化を意味します。 $key: 暗号化キー; $expiry: 暗号文の有効期間。
使用法:

$str = &#39;abcdef&#39;; 
$key = &#39;www.helloweba.com&#39;; 
echo authcode($str,&#39;ENCODE&#39;,$key,0); //加密 
$str = &#39;56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk&#39;; 
echo authcode($str,&#39;DECODE&#39;,$key,0); //解密

2. 暗号化および復号化関数 encrypt():

function encrypt($string,$operation,$key=&#39;&#39;){ 
  $key=md5($key); 
  $key_length=strlen($key); 
   $string=$operation==&#39;D&#39;?base64_decode($string):substr(md5($string.$key),0,8).$string; 
  $string_length=strlen($string); 
  $rndkey=$box=array(); 
  $result=&#39;&#39;; 
  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==&#39;D&#39;){ 
    if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ 
      return substr($result,8); 
    }else{ 
      return&#39;&#39;; 
    } 
  }else{ 
    return str_replace(&#39;=&#39;,&#39;&#39;,base64_encode($result)); 
  } 
}

$関数 encrypt($string,$operation,$key) の文字列: 必要な文字列暗号化および復号化される;$operation: 暗号化するか復号化するかを決定します。E は暗号化を意味し、D は復号化を意味します。
使い方:

$str = &#39;abc&#39;; 
$key = &#39;www.helloweba.com&#39;; 
$token = encrypt($str, &#39;E&#39;, $key); 
echo &#39;加密:&#39;.encrypt($str, &#39;E&#39;, $key); 
echo &#39;解密:&#39;.encrypt($str, &#39;D&#39;, $key);

要約: 以上がこの記事の全内容です。皆様の学習に役立てば幸いです。

#関連する推奨事項:

PHP は Ajax 呼び出しを通じて Baidu に接続し、Web サイトがインターネットに接続されているかどうかを検出する機能を実現します

PHP シングルトン モードの概念と特徴

#PHP における static キーワードの定義、遅延バインディング、self キーワードとの違い

以上がPHP の暗号化関数と復号化関数は、暗号化された文字列と復号化された文字列を生成します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。