메뉴 건너뛰기

프로그램언어

조회 수 13078 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


<?
/**************************************************
Base64 인코딩/디코딩 함수를 사용해보자
--------------------------------------------------
**************************************************/
// 귀차니즘 상수: 개행
define ( 'BR' , '<br>' ) ;

// 인코딩
$original = ‘a’ ;
$encode = base64_encode ( $original ) ;
echo $encode . BR ; // 결과: YQ==

// 디코딩 #01 : 인코딩 문자열 그대로 디코딩 시도
$decode = base64_decode ( $encode ) ;
echo $decode . BR ; // 결과: a
echo strlen ( $encode ) . BR ; // 결과: 4

// 디코딩 #02 : 인코딩 문자열에서 우측의 = 문자열 제거 후 디코딩 시도
$encode = rtrim ( $encode , ‘=’ ) ;
$decode = base64_decode ( $encode ) ;
echo $decode . BR ; // 결과: a
echo strlen ( $encode ) . BR ; // 결과: 2
?>

 

PHP 프로그램을 작성하시는 분들께서는 base64 인코딩/디코딩을 상당히 자주 사용하실 것이라고 생각됩니다.
URL 을 만들어야 하거나, MIME 타입 정의 할 때도 사용하고, 데이터베이스 및 파일에 암호화된 문자열을 넣어야 할 때도 쓰이지요. 혹은 소켓 통신 할때도 사용되구요.

하지만, 대부분의 개발자는 base64 인코딩/디코딩에 대해서 얼마나 이해하고 있을까요?
※ 넌 아냐? 글쓰는 이유를 합리화하고 있다. ㅡㅡ;
그래서, base64 인코딩/디코딩에 대한 심도 깊은(?) 공부를 해보기 위하여 간략한 테스트 프로그램을 작성해 보았습니다.

위에 표기된 예제 프로그램은 $string 변수에 할당된 문자열을 base64_encode 함수로 인코딩하고, 인코딩된 문자열이 할당된 $encode 변수를 두 가지 방식으로 디코딩하는 매우 간단한 프로그램(?) 입니다.

이 프로그램에서 $original 에 할당된 원문 문자열의 길이를 `a` 에서부터 `abcdefghijklmnopqrstuvwxyz` 까지 늘려가며 테스트를 진행한 결과, 다음과 같은 재미있는 – 정말 재미있는거 맞지? – 사실을 확인 할 수 있었습니다.

1. base64_encode 함수로 인코딩된 문자열은 인수로 전달된 문자열의 길이 수와 비례하여 늘어난다.
2. `인코딩 문자열의 byte = ( 인수 문자열의 byte / 3 )  * 4` 공식이 성립된다.
       ※ 단, 괄호 안의 값이 소수점이 나오면 올림하여 계산한다.
3. base64_encode 함수의 결과로 반환된 문자열의 `=` 문자는 자리 수 채우기 위한 용도다.
4. base64_encode 함수의 결과 문자열에서 `=` 문자를 제거해도, 디코딩에는 영향을 주지 않는다.
5. base64 함수는 한, 영, 특수문자 구분 없이 byte 로 계산된다.

확인된 사실을 목록으로 표현해보니… 완전히, 꿀꿀한게 학습 분위기만 풀풀 나는군요. ^^;
그럼, 좀 더 쉽게 이해하기 위해서 위의 예제 소스를 기반으로 이야기를 계속해 보겠습니다.
※ 고마해라~ 다 안다. 굳이 필요치 않다니까!

base64_encode 함수의 인수를 `a` 부터 `abcdef` 까지, 글자 수를 늘려가며 테스트 해본 결과는 다음과 같습니다.

echo base64_encode ( 'a' ) ; // 결과: YQ==
echo base64_encode ( 'ab' ) ; // 결과: YWI=
echo base64_encode ( 'abc' ) ; // 결과: YWJj

echo base64_encode ( ‘abcd’ ) ; // 결과: YWJjZA==
echo base64_encode ( ‘abcde’ ) ; // 결과: YWJjZGU=
echo base64_encode ( ‘abcdef’ ) ; // 결과: YWJjZGVm

 

위 실행 결과에서 확인된 바와 같이, `abc` 와 `abcdef` 를 인수로 전달한 경우를 제외하면, base64_encode 함수의 결과 문자열에는 항상 `=` 문자가 붙어 있습니다. 즉, base64_encode 함수는 인수의 문자열 길이(byte) 값이 3 으로 나누어 떨어질 때를 제외하면 모든 결과 문자열에는 `=` 문자가 붙는 것을 알 수 있습니다.

또한, base64_encode 함수의 결과 문자열은 인수로 전달된 문자열의 길이(byte)에 상관없이 언제나 4로 나누어 집니다.

왜 이런 결과가 나오는 걸까요?
※ 월래리!? 독자에게 질문질이냐??

base64 인코딩/디코딩 함수는 함수 이름에도 포함되어 있듯이, 인수로 전달된 문자열을 64bit 로 인코딩/디코딩하여 결과를 반환합니다. 즉, base64_encode 함수는 현재 시스템에서 사용하는 2진수 데이터를 64진수 데이터로 변경해서 표현하겠다는 의미입니다.
※ 64bit = 2 ^ 6

보편적으로 컴퓨터는 byte 라고 하여 8bit 를 기준으로 데이터를 표현하는 것이 일반적 – byte 에 대한 숨은 이야기도 꽤 재미(?) 있습니다 – 입니다. 즉, 64bit 는 2bit 의 6 제곱이므로, 8bit 로 표현된 데이터를 6bit 로 바꿔서 표현하게 됩니다.

bits

먼저, 8bit 로 구성된 문자열 `abc` 를 8bit 2진 문자열로 변환하면 `0110 0001 0110 0010 0110 0011` 이 됩니다.
이 값을 6bit 로 구분지어 각각의 값(10진수로 변환한 값)과 일치하는 base64 문자셋으로 변경하면 6bit 문자열이 완성됩니다.

여기서, base64 문자셋이란 a~z, A~Z, 0~9, +, / 로 이뤄진 문자코드 표로 각 문자의 10진 수 값은 다음과 같습니다.

code

그러나, 만약에 8bit 2진 문자열이 6bit 로 나누어지지 않고 남는다면 어떻게 될까요?

base64 인코딩은 24bit 단위로 나누어서 수행됩니다. 즉, 인코딩 대상 문자열을 3byte 씩 나누어서 인코딩을 하게 됩니다. 그러므로, 남는 비트가 생기면 나머지 값을 모두 0 으로 채워 넣게 됩니다.

bits2



List of Articles
번호 제목 날짜 조회 수
320 파일 이름에서 확장자 추출마스터 2017.03.07 20061
319 파일 업로드 (중복처리) 2017.03.06 20181
318 파일 삭제 2015.04.14 25334
317 파일 및 데이타베이스 백업 2019.01.08 1610
316 파일 다운로드 함수(멀티 이어받기/속도제한) 2020.06.19 618
315 파일 output을 return 하기 2021.03.26 243
314 파일 2019.01.08 1226
313 특정일의 주차 구하기 2021.07.08 322
312 특수문자 없애는 정규표현식 2014.03.26 21623
311 템플릿 관련 정보 2016.08.22 20732
310 태그 또는 멘션 소스 뽐아내기방법 2019.01.16 1249
309 키를 이용한 암호화/복호화 함수입니다. 2018.07.24 5741
308 클래스와 인스턴스 그리고 메소드 만들기 2021.03.27 231
307 큰따옴표(") 와 작은따옴표(') 2021.03.25 270
306 쿠폰번호 발행 업데이트판. (간단한 클래스화[PHP4 기준] 등...) 2018.07.19 6024
305 쿠키변수받기 2014.02.27 29211
304 쿠키 확인 후 만료시 세션 파괴하는 방법 2020.11.23 314
303 콜론 연산자 2021.03.26 307
302 코드 생성 하기 2023.01.12 213
301 체크박스, post 로 넘기고 받아서 다시 체크하기, checkbox 2017.03.07 21129
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 17 Next
/ 17

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved