>  기사  >  백엔드 개발  >  PHP 암호화 및 복호화 기능은 암호화 및 복호화된 문자열을 생성합니다.

PHP 암호화 및 복호화 기능은 암호화 및 복호화된 문자열을 생성합니다.

墨辰丷
墨辰丷원래의
2018-06-11 14:12:482152검색

PHP 암호화 및 복호화 기능 공유, 하나는 Discuz!의 인증 코드 암호화 기능(상세 분석 포함)이고 다른 하나는 encrypt() 기능입니다. 특정 정보를 암호화하려면 PHP를 사용해야 합니다. 즉, 암호화된 문자열은 암호화 알고리즘을 통해 생성되며, 이 암호화된 문자열은 프로그램이 해독된 정보를 쉽게 처리할 수 있도록 해독 알고리즘을 통해 해독될 수 있습니다.

때때로 프로젝트에서 특정 정보를 암호화하기 위해, 즉 암호화 알고리즘을 통해 암호화된 문자열을 생성하기 위해 PHP를 사용해야 하는 경우가 있습니다. 이 암호화된 문자열은 해독된 정보를 프로그램이 쉽게 처리할 수 있도록 해독 알고리즘을 통해 해독될 수 있습니다.
가장 일반적인 애플리케이션은 사용자 로그인 및 일부 API 데이터 교환 시나리오입니다.

저자는 여러분과 공유할 몇 가지 고전적인 PHP 암호화 및 암호 해독 기능 코드를 수집했습니다. 암호화 및 복호화의 원칙은 일반적으로 특정 암호화 및 복호화 알고리즘을 사용하고 알고리즘에 키를 추가한 후 최종적으로 암호화 및 복호화 결과를 얻는 것입니다.

1. 매우 강력한 인증 코드 암호화 기능, Discuz! 클래식 코드(자세한 설명 포함):

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 in function authcode($string, $Operation, $key, $expiry): string, plaintext 또는 ciphertext ; : 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), $string: 암호화 및 복호화가 필요한 문자열; 암호화 또는 복호화 여부, 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 효과에 연결하여 웹 사이트가 인터넷에 연결되어 있는지 감지하는 기능을 구현합니다.

PHP 싱글턴 모드의 개념과 특징

정의 PHP의 정적 키워드, 후기 바인딩 한정 키워드와 자체 키워드의 차이점

위 내용은 PHP 암호화 및 복호화 기능은 암호화 및 복호화된 문자열을 생성합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.