PHP & Others

php 암호화 복호화

컨텐츠 정보

본문

[출처] php 암호화 복호화|작성자 Gabriel


1. 평문과 키값을 아스키 코드로 변환하여 더한 다음 암호화 시키고,

   복호화 에서는 암호문과 키값을 아스키 코드로 변환하여 뺀다음 복호화 시키는 방법

 

    특징 :

   대칭키 암호화 방식  

   암호화한 것을 복호화시 한글, 영문, 숫자가 깨지지 않는다. 간단한 알고리즘에 아이디어가 굿!

 

 

Usage is as follows:
$encrypted = encrypt("to encrypt string", "chitgoks");
$decrypted = decrypt($encrypted, "chitgoks");

$decrypted will return to encrypt string.

function encrypt($string, $key) {
  $result = '';
  for($i=0; $i<strlen($string); $i++) {
    $char = substr($string, $i, 1);
    $keychar = substr($key, ($i % strlen($key))-1, 1);
    $char = chr(ord($char)+ord($keychar));
    $result.=$char;
  }

  return base64_encode($result);
}

function decrypt($string, $key) {
  $result = '';
  $string = base64_decode($string);

  for($i=0; $i<strlen($string); $i++) {
    $char = substr($string, $i, 1);
    $keychar = substr($key, ($i % strlen($key))-1, 1);
    $char = chr(ord($char)-ord($keychar));
    $result.=$char;
  }

  return $result;
}

 

 

출처 : http://tech.chitgoks.com/2008/03/24/php-encrypt-decrypt-using-base64/ 

 

 

 

 

 

 

2. 위에 1번 소스를 응용해서 만든거

   평문을 아스키 코드로 변환하고 평문 문자열길이를 더한다음 키값과 XOR 하여 암호화

   복호화는 그 반대로 암호문과 키값을 XOR 하고 암호문의 문자열 길이만큼 빼서 복호화

 

   특징 :

   대칭키 암호화 방식

   암호화한 것을 복호화시 한글, 영문, 숫자가 깨지지 않는다.

 

  함수 :

  php strlen();함수는 문자열의 길이를 반환한다.

  php ord();함수는 문자를 아스키코드값으로 변환한다. 문자열을 집어 넣었다면 첫번재 문자를 아스키 코드값으로 변환후 반환

  php chr();함수는 아스키 코드를 문자로 변환한다.

  php substr();함수는 문자열을 내가 원하는 위치부터 위치까지를 잘라서 사용 할 수 있다.

 

function encrypt($value, $key){   
  $result = "";
  for($i=0; $i<strlen($value); $i++){  
   $val1 = chr(ord(substr($value, $i, 1))+strlen($value));
   $key1 = substr($key, ($i % strlen($key)), 1);

   $val1 = $val1 ^ $key1;   
   $result .= $val1;   
  }
  return base64_encode($result);  
 }

 $encrypted = encrypt("암호화","madebylee");
 echo $encrypted."<br>";

 

 function decrypt($value, $key){
  $result = "";
  $value = base64_decode($value);

  for($i=strlen($value)-1; $i>=0; $i--){
   $val2 = substr($value, $i, 1);
   $key2 = substr($key, ($i % strlen($key)), 1);
   
   $val2 = $val2 ^ $key2;
   $val2 = chr(ord($val2)-strlen($value));
   $result = $val2.$result;
  }
  return $result;
 }

 $decrypted = decrypt($encrypted, "madebylee");
 echo $decrypted;

 

 

 

 

 

3. 진수 변환을 이용한 암호화, 복호화

 

   평문을 10진수에서 8진수로 암호화

   복호화는 암호문을 8진수에서 10진수로 복호화

   

   특징 :

   암호문 복호화시 영문과 숫자는 괜찮은데 한글이 깨진다. 한글을 아스키코드로 변환하여 진수를 변환해서 그런듯.

   한글 안깨졌으면 대칭키로 만들어 봤을텐데 한글이 깨져서 테스트용으로 만들다 보니 대칭키 암호화 방식이 아님

   

   함수 :

   php decoct();함수는 10진수를 8진수로 변환한다.

   php octdec();함수는 8진수를 10진수로 변환한다.

   php strlen();함수는 문자열의 길이를 반환한다.

   php ord();함수는 문자를 아스키코드값으로 변환한다. 문자열을 집어 넣었다면 첫번재 문자를 아스키 코드값으로 변환후 반환

   php chr();함수는 아스키 코드를 문자로 변환한다.

   php substr();함수는 문자열을 내가 원하는 위치부터 위치까지를 잘라서 사용 할 수 있다.

 

function encrypt($value){   
  for($i=0; $i<strlen($value); $i++){  
   $val = chr(decoct(ord(substr($value,$i,1))));
   $rst .= $val;    
  } 
  $encode = base64_encode($rst);
  return $encode;   
 }

 

 function decrypt($value){ 
  $decode = base64_decode($value);

  for($i=0; $i<strlen($decode); $i++){  
   $val = chr(octdec(ord(substr($decode,$i,1))));
   $rst .= $val;
  }
  return $rst;
 }

 

 

 $test = encrypt("abcde");
 echo $test."<br>";

 $test1 = decrypt($test);
 echo $test1."<br>";

 

 

 

 

 

 

 

4. XOR을 사용한 대칭키 암호화, 복호화

 

   평문과 평문을 섞은 키값을 XOR연산하여 암호화 한다.

   리턴할때, 암호문과 키값을 같이 리턴

   복호화는 암호문을 받아 구분자를 이용해서 잘라서 암호문과 키 값을 XOR연산하여 복호화 시킨다.

 

   특징 :

   암호문을 복호화 할때 한글, 영문, 숫자 모두 사용가능 하다.

   키값은 함수안에서 암호화 되기 때문에 나도 모른다.

   간단하다. 

 

   함수 :

   php str_shuffle(); 함수는 안에 들어온 문자열을 섞어서 반환한다.

   php explode(); 함수는 구분자를 이용해 문자열을 잘라서 배열로 사용한다.

 

 

function encrypt($value){  
  $tmp = str_shuffle($value);

  $encode = $value ^ $tmp;
  return $encode.",".$tmp;
 }


 

 function decrypt($value){
 
  $val = explode(",",$value);
  $decode = $val[0];
  $key = $val[1];

  $decode = $decode ^ $key; 
  return $decode;
 }


 $decode = encrypt("암호화"); 
 echo $decode."<br>";


 $test2 = decrypt($decode);
 echo $test2."<br>";

[출처] php 암호화 복호화|작성자 Gabriel






출처 : 
[php] 64진수로 암호화하는 base64 함수


string base64_encode ( string $data ) (PHP 4, PHP 5)

이 함수는 모든 정보를 64개 문자로 구성된 64진수로 바꾸는 것으로 a-z, A-Z, 0-9, +, / 의 문자이며암호화 방식과는 거리가 멀고 데이터보다  33%  많은 공간을 필요로 합니다.

예제 (ex #1

 <?php  
 $str 
'This is an encoded string'
;  
 echo 
base64_encode($str
);  
 
// 결과: VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==  
 
?>


64 문자는 = 포함한 문자인데, = 단순히 4자리 수를 맞춰   공간을 채우는 의미 없는 문자이므로 신경쓰지 않아도 됩니다.

 

 인코딩은 메일 본문처럼 8비트를 사용할  없는 전송 층에서 바이너리 데이터를 안전하게전송하도록 설계되었습니다.

 

다만, GET이나 REQUEST 전송시 +, / 문자가 문제시 되므로 urlencode 데이터를 보호하거나 다음과 같이 치환해서 데이터를 보호해줄 필요가 있습니다.

예제 (ex #1

 <?php 
 
function base64encode($string) {  
    
$data str_replace(array('+','/','='),array('-','_',''),base64_encode($string));  
    return 
$data;  
 }  

 function 
base64decode($string) {  
    
$data str_replace(array('-','_'),array('+','/'),$string);  
    
$mod4 strlen($data) % 4;  
    if (
$mod4) {  
        
$data .= substr('===='$mod4);  
    }  
    return 
base64_decode($data);  
 }  

 
$string '1234567890가나다라마바사';  
 
$data base64encode($string);  

 echo 
$data// 결과: MTIzNDU2Nzg5MLChs6q02bbzuLa52bvn  
 
echo '<br />';  

 echo 
base64decode($data); // 결과: 1234567890가나다라마바사  
 
?>
 

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
우리가 최선을 다해야 하는 이유는 사람들을 감동시키기 위해서가 아니다. 최선을 다할 때만이 자신이 즐겁게 일할 수 있기 때문이다. (앤드류 매튜스)