>  기사  >  백엔드 개발  >  PHP 대칭 암호화 기능으로 데이터 암호화 및 복호화 구현

PHP 대칭 암호화 기능으로 데이터 암호화 및 복호화 구현

高洛峰
高洛峰원래의
2017-01-07 16:32:432296검색

프로젝트에는 사용자 ID를 암호화하여 복호화를 위해 다음 연락처로 전송하는 곳이 있습니다. (너무 많이 공개하지 못한 점 양해해주세요 -_-!) 가장 먼저 떠오른 것이 Kangsheng Ucenter의 함수였는데, 나중에 Concise Magic에서 검색하다가 간단한 방법을 발견해서 여러분이 사용하는 함수 형태로 통합시켰습니다.

1. 대칭암호

송신자는 키와 알고리즘을 이용하여 평문을 암호문으로 가공하여 전송하고, 수신자는 키와 알고리즘을 이용하여 암호문을 평문으로 처리한다. 동일한 키를 사용하여 암호화 및 복호화됩니다.

암호화와 복호화에 동일한 키를 사용하기 때문에 보안은 알고리즘뿐만 아니라 키의 보안에도 관련됩니다.

물론 키가 복잡할수록 좋다는 것은 아닙니다. 반대로 키는 일반적으로 더 작습니다. 왜냐하면 키가 클수록 암호화는 강력하지만 암호화 및 속도가 느려지기 때문입니다. 복호화 과정에서 키의 크기가 커지므로 효율성뿐만 아니라 안전성도 고려해야 합니다.

결국 대칭암호 알고리즘의 특징은 알고리즘이 공개되어 있고, 계산량이 적고, 암호화 속도가 빠르고, 암호화 효율성이 높다는 점이다. 비대칭 암호화를 직접 사용하는 것이 좋습니다.

또한, 한 쌍의 사용자가 대칭 암호화 알고리즘을 사용할 때마다 상대방이 알 수 없는 고유 키를 사용해야 합니다. 이로 인해 발신자와 수신자 모두 소유한 키의 수가 많아지게 됩니다. 기하급수적으로 증가하여 관리가 사용자에게 부담이 됩니다.

대칭형 암호화 알고리즘은 분산 네트워크 시스템에서 사용하기 어려운데, 그 이유는 주로 키 관리가 어렵고 사용 비용이 높기 때문입니다.

2. 비대칭 암호화

비대칭 암호화는 암호화 및 복호화에 공개 키와 개인 키 쌍을 사용하여 상대적으로 안전합니다. 개인키는 한 사람만이 안전하게 보관할 수 있고 유출될 수 없으며, 공개키는 요청하는 누구에게나 전송될 수 있습니다.

가장 일반적인 비대칭 암호화는 아마도 은행 시스템과 결제 플랫폼일 것입니다. 예를 들어 Alipay 또는 UnionPay 결제 인터페이스를 신청하면 공개 키를 받게 되며, 쇼핑몰에서 결제할 때 공개 키를 사용하여 정보를 암호화하고 플랫폼에 제출합니다. 귀하의 정보를 해독하고 결제 작업을 수행합니다.

비대칭 암호화는 매우 안전하지만 대칭 암호화에 비해 속도가 매우 느리기 때문에 일반적으로 우리가 처리할 때 메시지를 전송할 때 대칭 암호화를 사용하는 경우가 많지만 대칭 암호화에 사용되는 키는 바로 우리입니다. 비대칭 암호화를 통해 전송될 수 있습니다. 신청한 결제 인터페이스를 다시 생각해 보세요. 키 쌍을 받았나요? ^.^

3.

대칭 암호화와 함께 사용하면 속도가 빠르고 대용량 데이터 전송에 좋습니다. 비대칭 암호화 암호화 및 복호화는 시간이 오래 걸리고 속도가 느리며, 소량의 데이터를 암호화하는 데에만 적합합니다. 그러나 비대칭 암호화의 보안성은 매우 높습니다.

장점을 최대한 활용하고 약점을 피하세요. 비대칭 암호화 공개 키를 사용하여 대칭 암호화 키를 암호화한 후 수신자는 개인 키를 사용하여 복호화하여 대칭 암호화 키를 얻습니다. 그러면 양측이 대칭 암호화를 사용하여 통신할 수 있습니다.

프로젝트에 사용된 방법을 공개하는 것은 적절하지 않지만 여기에는 다른 두 가지 예만 나열되어 있습니다. 첫 번째는 ucenter에서 나온 것이고, 두 번째는 Concise Magic에서 본 것입니다.

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 == &#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 {
  return $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
 }
}
/*********************************************************************
函数名称:encrypt
函数作用:加密解密字符串
使用方法:
加密  :encrypt(&#39;str&#39;,&#39;E&#39;,&#39;nowamagic&#39;);
解密  :encrypt(&#39;被加密过的字符串&#39;,&#39;D&#39;,&#39;nowamagic&#39;);
参数说明:
$string :需要加密解密的字符串
$operation:判断是加密还是解密:E:加密 D:解密
$key  :加密的钥匙(密匙);
*********************************************************************/
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));
 }
}

위 내용이 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 모든 분들이 PHP 중국어 웹사이트를 지지해 주시길 바랍니다.

데이터 암호화 및 복호화 구현을 위한 PHP 대칭 암호화 기능과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


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