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
“무릇 물이란 지세를 따라 흐르되 작은 틈도 놓치지 않고 적시니 지혜를 갖춘 자와 같고, 움직이면서 아래로 흘러가니 예를 갖춘 자와 같으며, 어떤 깊은 곳도 머뭇거리지 않고 들어가니 용기를 가진 자와 같고 장애물이 막혀서 갇히면 고요히 맑아지니 천명을 아는 자와 같으며, 험한 곳을 거쳐 멀리 흐르지만 끝내 남을 허물어뜨리는 법이 없으니 덕을 가진 자와 같다. 천지는 이것으로 이루어지고, 만물은 이것으로 살아가며, 나라는 이것으로 안녕을 얻고, 만사는 이것으로 평안해지며, 만물은 이것으로 바르게 되는 것이다. 이것이 지혜로운 자가 물을 좋아하는 이유이다.” (한영, <<한시외전>>)