반응형
for( $re = 0; $re < 10; $re++ ) {
$code = gzinflate(base64_decode($code));
}
PHP의 함수들을 이용해서 매우 간단한 소스 코드 암호화 인코더&디코더 작업을 해보겠습니다.
(해당 인코더는 맛보기 수준이므로, 로더가 필요 없는 대신 인코더의 장점인 PHP 실행 속도 향상은 있지 않으며 그저 소스코드를 보지 못하게 하는 용도)
1. 사용 함수
eval ( string $code ) | 매개변수 $code를 php로 실행함. * 매개변수로 주어진 값을 PHP로 실행시키는 것이기에 $_GET, $_POST 등에 관련된 부분에서 해당 함수는 보안에 취약하기에 쓰지 않는 것이 좋습니다. |
gzdeflate ( 아무튼 많음 ) : string|false | 문자열을 gz 압축하는 함수, 리턴 값을 압축한 값으로 반환하는데 이를 실패시 false 오류를 반환합니다. |
gzinflate ( string $data [, int $max_length = 0 ] ) : string|false | gz 압축된 값을 해제하는 함수, 압축되지 않았거나 오류 발생시 false를 반환. |
base64_encode ( string $data ) : string | 매개변수 $data를 base64 방식으로 인코딩합니다. * base64 방식으로 인코딩은 데이터의 양은 늘어나나 그 대신 ASCII에 비해 안전한 데이터 전달이 가능해짐. |
base64_decode ( string $data [, bool $strict = false ] ) : string|false | 매개변수 $data를 base64 방식으로 디코딩합니다. |
2. 사용법
우선 $code 변수를 gzdeflate로 압축해줍니다.
$code = "echo 'hello world';";
$code = gzdeflate($code);
echo $code;
위와 같이 $code를 gz로 압축을 하고 이를 출력함으로써 글이 깨진 것을 알 수 있습니다.
(gz : 초기 리눅스 시스템에서 등장한 압축 유틸리티)
$code를 이번엔 base64_encode로 인코딩해줍니다.
$code = "echo 'hello world';";
$code = gzdeflate($code);
$code = base64_encode($code);
echo $code;
그러면 위와 같은 base64로 인코딩 된 것을 알 수 있습니다.
이렇게 암호화된 텍스트는 복호화 작업을 거치지 않을 경우 알아볼 수 없습니다.
다음 방법들로 복호화 작업을 할 수 있습니다.
base64인 값을 디코딩을 하면
$code = "echo 'hello world';";
$code = gzdeflate($code);
$code = base64_encode($code);
$code = base64_decode($code);
echo $code;
이전에 나온 gz 형식의 값이 나온 것을 알 수 있습니다.
gz 압축을 해제하면
$code = "echo 'hello world';";
$code = gzdeflate($code);
$code = base64_encode($code);
$code = gzinflate(base64_decode($code));
echo $code;
아래와 같이 $code의 값이 나온 것을 알 수 있습니다.
해당 값을 eval의 넣으면 아래와 같이 hello world가 출력됩니다.
$code = "echo 'hello world';";
$code = gzdeflate($code);
$code = base64_encode($code);
$code = gzinflate(base64_decode($code));
eval($code);
3. 활용
암호화 작업은 한 번만 하는 것이 아닌 여러 번 하는 것도 가능합니다.
$code = "echo 'hello world';";
for( $re = 0; $re < 10; $re++ ) {
$code = base64_encode(gzdeflate($code));
}
BcHLdkQwAADQD7JI03guupAhGKaj8ZzZkRKq8RhOqK/vvZj539MQ7LbtcIyuNDsge1sOcvQV+IVr0SOn70IGkMICLfQV5UW3xEOOnw+NExIDztEcYV2+8H7ClMQQPUbgIe5bUDXrn8l4F0Bs/Wdbs0snXUriLVyqfDdHSXBnNO1KEn8SeYUhOBVJw9R5Hj0JlnwojmQZof1XivRBt2q+UwYTG7rtPfK+KL3oNDtvcg7UBotaupPH05JzTUV9VostBlrpqroJl5JBpxyellbsq2WJgnMWeW1dSh5Fsman7l2JC/jt4x8= |
위 텍스트와 같이 암호화 작업을 반복할 경우 이전보다 보기 더 어렵게 변하는 것을 알 수 있습니다
하지만 텍스트가 차지하는 용량도 그만큼 늘어나게 됩니다.
위 함수를 복호화 하려면 암호화한 만큼 복호화를 하면 됩니다.
for( $re = 0; $re < 10; $re++ ) {
$code = gzinflate(base64_decode($code));
}
반응형
'PHP > Modern PHP' 카테고리의 다른 글
[PHP] 게시판 만들기 with MVC - 3부 View(List & Create) (1) | 2023.12.27 |
---|---|
[PHP] 게시판 만들기 with MVC - 2부 Routing (0) | 2023.12.26 |
[PHP] 게시판 만들기 with MVC - 1부 Migration (1) | 2023.12.26 |
[PHP] PHP 면접 질문 정리 (1) | 2023.12.08 |
PHP 써야 할까? (0) | 2022.11.18 |