이디군만세이글루

기능 테스트 중인 이글루입니다. 내용은 아직 없습니다.
by 이디군 dagui.egloos.com | 이글루스 | 로그인

[TIP/PHP] 초간단암호화 tbase64

역시 1년쯤 전에 PHP스쿨에 올려서 히트쳤던 TIP

그간 한 짓들중 괜찮은 것들은 내용은 한곳에 다 모아놓으려고 합니다.

http://www.phpschool.com/bbs2/inc_view.html?id=9939&code=tnt2

=================================

질문답변 게시판에 누가 원하시는것 같아 올립니다.

간단하게 암호화(?) 하고 싶을 때 제가 쓰는 방법입니다.

안전하다고 생각하고 믿고 쓰시면 안될것 같고..
사용자한테 모든 정보가 휭하니 보이는 것을 피하는 정도로만 쓰는 편이 좋을듯 합니다.

2차대전당시 이니그마머신이라고 꽤 유명한 암호화 기계가 있었죠..
영화 U-571에도 나오고 게임 코만도스2에도 나오는..

그것은 타자기와 문자치환기가 결합된 형태였는데..
ABCD 라고 치면 CGZE 같은 식으로 자동으로 변환되는 것이었습니다.

A => C
B => G

같은 식으로 매핑시켜주는 톱니바퀴가 여러겹으로 있는 것이었습니다.

A => C => Z => F => Q

스물몇개였다고 하던가.. 암튼간에 톱니바퀴의 조합 순서를 바꿔주면
간단하게 암호화 키가 바뀌는 대충 그런 원리입니다.

이것을 제대로 풀려면 원래 타이핑 할 때 쓴 톱니바퀴들의 순열을 알거나
꺼꾸로 모든 순열로 짜맞춰봐야 했는데..

그당시의 기술로는 거의 불가능에 가까웠던 거죠..
아마도 지금은 컴퓨터가 많이 발전했으니.. 우스운 수준일겁니다.

그 원리량 약간 비슷한 것입니다. 일단 모든 글자를 영문자로 바꾸기 위해서
(영문자가 취급하기 쉽기 때문입니다. 별 의미는 없음) base64 인코딩을 합니다.

그리고 base64의 64개의 문자를 섞어서 평문 글자셋과 암호문 글자셋의
1:1 매핑을 만들죠.. 이 매핑이 다르면 제대로 해독되지 않습니다.

평문 문자셋은 고정시켜도 되니가 그냥 코드에 넣고..
암호 문자셋은 생성시켜서 세션에 넣습니다.
한 세션에서는 같은 키를 사용하도록 하는 거죠..

평문 문자셋과 암호 문자셋은 각각의 문자열로 만들고 치환하는데는 strtr()함수를 씁니다.
(strtr()함수가 없으면 참 짜증나는 작업이 되었을 걸로 생각됨.. 그래서 strtr()의 원조인
tr 명령어를 기리기 위해서 tbase64라고 이름을 지었습니다.)

평문 문자셋에서 원래 '+'와 '/'는 암호 문자셋에서 URL에서 특수한 의미를 가지기 때문에
GET 방식으로 전달될 때를 생각해서 각각 '_' 와 '$' 로 교체했습니다.

그리고 base64는 자리수가 안맞을 때 맨 끝에 패딩문자로 '=' 를 쓰는데.. 이것도
URL을 고려해 '*'로 바꾸었습니다.

반드시 세션이 필수입니다. 암호키를 쿠키에 저장할 수는 없는 노릇이니..
아니면 고정값을 쓰던가..

session_start();

$BASE64_CHARS = '+/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
function tbase64_getkey()
{
       if ($_SESSION['TBASE64_KEY'] == '')
       {
              $array = array(
                     '_', '$', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*',
                     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
                     'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
              );
              shuffle($array);
              $_SESSION['TBASE64_KEY'] = join('', $array);
       }
       return $_SESSION['TBASE64_KEY'];
}

function tbase64_encode($str)
{
       global $BASE64_CHARS;
       $key = tbase64_getkey();
       return strtr(base64_encode($str), $BASE64_CHARS, $key);
}

function tbase64_decode($encoded)
{
       global $BASE64_CHARS;
       $key = tbase64_getkey();
       return base64_decode(strtr($encoded, $key, $BASE64_CHARS));
}

$original = "name=메롱&jumin=1111111111118&sex=M";
$tbae64_key = tbase64_getkey();
print "original: $original<br> ";
print "tbae64_key: $tbae64_key<br> ";

$base64_encoded = base64_encode($original);
print "base64_encoded: $base64_encoded<br> ";
$encoded = tbase64_encode($original);
print "encoded: $encoded<br> ";

$decoded = tbase64_decode($encoded);
print "decoded: $decoded<br> ";


by 이디군 | 2004/10/04 00:04 | +웹프로그래머 이디군 | 트랙백 | 덧글(0)
트랙백 주소 : http://dagui.egloos.com/tb/388084
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글


◀ 이전 페이지 | ▲ 우으로 | 다음 페이지 ▶