PHP 대칭 암호 화 함수 데이터 암호 화 복호화

프로젝트 중 한 곳 은 사용자 ID 를 암호 화하 고 다음 접점 으로 전송 하여 역 해 를 하 는 수 요 를 사용 합 니 다.(내 가 너무 많이 누설 하면 안 되 는 것 을 용서해 라- -!),첫 번 째 로 떠 오 르 는 것 은 강성 유 센터 의 함수 이다.나중에 찾 아 보 니 간단명료 한 마법 에서 도 간단 한 방법 을 찾 아 통합 시 켜 자신 이 사용 하 는 함 수 를 만 들 었 다.
대칭 암호 화
발송 자 는 명문 을 키 와 알고리즘 으로 처리 하여 비밀문서 로 보 내 고 수신 자 는 키 와 알고리즘 을 사용 하여 비밀문서 로 처리 하 며 수신 자 는 같은 키 로 데 이 터 를 암호 화하 고 복호화 합 니 다.

같은 키 를 사용 하여 암호 화,복호화 하기 때문에 안전성 은 알고리즘 뿐만 아니 라 키 의 안전 도 중요 합 니 다.
물론 키 가 복잡 할 수록 좋 은 것 은 아 닙 니 다.반대로 키 는 작 습 니 다.키 가 클 수록 암호 화가 강하 지만 암호 화 와 복호화 과정 이 느 릴 수록 키 의 크기 는 안전성 도 고려 해 야 하고 효율 도 고려 해 야 합 니 다.
대칭 암호 화 알고리즘 의 특징 은 알고리즘 이 공개 되 고 계 산 량 이 적 으 며 암호 화 속도 가 빠 르 고 암호 화 효율 이 높다 는 것 이다.효율 이 높다 는 장점 이 없 으 면 비대 칭 암호 화 를 직접 사용 하 는 것 이 낫다.
또한 사용자 가 대칭 암호 화 알고리즘 을 사용 할 때마다 다른 사람 이 모 르 는 유일한 열 쇠 를 사용 해 야 하기 때문에 수신 자 쌍방 이 가지 고 있 는 열쇠 의 수량 이 기 하급 수적 으로 증가 하고 키 관리 가 사용자 의 부담 이 될 수 있다.
대칭 암호 화 알고리즘 은 분포 식 네트워크 시스템 에서 사용 하기 가 어렵 습 니 다.주로 키 관리 가 어렵 고 사용 원가 가 높 기 때 문 입 니 다.
2.비대 칭 암호 화
비대 칭 암호 화 는 상대 적 으로 안전 합 니 다.한 쌍 의 키 를 사용 하여 키 와 개인 키 를 공개 하여 각각 암호 화 와 복호화 에 사용 합 니 다.비밀 키 는 한 측 만 안전하게 보관 할 수 있 고 누설 할 수 없 으 며 공개 키 는 요청 한 사람 에 게 보 낼 수 있다.

가장 흔히 볼 수 있 는 비대 칭 암호 화 는 바로 은행 시스템,결제 플랫폼 일 것 이다.예 를 들 어 저희 가 알 리 페 이 나 은 련 결제 인 터 페 이 스 를 신청 할 때 공개 키 를 얻 을 수 있 습 니 다.쇼핑 몰 에서 결 제 를 하 는 것 은 공개 키 로 정 보 를 플랫폼 에 암호 화하 고 플랫폼 에서 키 를 사용 하여 귀하 의 정 보 를 복호화 하고 결제 작업 을 하 는 것 입 니 다.
비대 칭 암호 화 는 안전 하지만 대칭 암호 화 에 비해 매우 느 립 니 다.그래서 우리 가 일반적으로 처리 하면 대부분 대칭 암호 화로 메 시 지 를 전송 하지만 대칭 암호 화 에 사용 되 는 키 는 비대 칭 암호 화 방식 으로 보 낼 수 있 습 니 다.당신 이 신청 한 결제 인 터 페 이 스 를 생각해 보 세 요.키 한 쌍 을 주 었 나 요?^.^
3.결합 사용
대칭 적 인 암호 화 속도 가 빠 르 기 때문에 대량의 데 이 터 를 보 낼 때 사용 하 는 것 이 좋다.비대 칭 암호 화 와 복호화 가 오래 걸 리 고 속도 가 느 려 서 소량의 데 이 터 를 암호 화 하 는 데 만 적합 하지만 비대 칭 암호 화의 안전성 은 매우 높다.
장점 을 살 리 고 단점 을 피한다.대칭 암호 화 된 키 를 비대 칭 암호 화 된 공개 키 로 암호 화 한 다음 에 보 내 고 수신 자 는 비밀 키 를 사용 하여 암호 화 된 키 를 복호화 한 다음 에 쌍방 은 대칭 암호 화 를 사용 하여 의사 소통 을 할 수 있다.

프로젝트 에서 사용 하 는 방법 은 밝 히 는 것 이 좋 지 않 습 니 다.여기에 두 개의 다른 예 만 열거 하 세 요.첫 번 째 는 ucenter 중,두 번 째 는 간단명료 한 마법 에서 본 것 이다.
주의해 야 할 것 은 base 64 알고리즘 이기 때문에 암호 화 된 문자열 에+\가 나타 날 수 있 습 니 다.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));
 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기