php 암호화 복호화
컨텐츠 정보
- 30,249 조회
- 0 추천
- 목록
본문
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가나다라마바사 ?> |
관련자료
-
링크