이디군만세이글루[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> ";
|
|
|||||