....
이것만 보곤 잘 이해되지 않고, 덧붙여 설명하자면...
우선 base64는 '문자열을 기본적인 64개의 문자로 변환해버린다' 라고 생각해 두면 편하겠다. (조금은 다르지만,,)
여기서 기본적인 64개의 문자는
" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ = "
이고 마지막 '=' 는 추가로 padding문자라고 불린다.
이렇게 모든 문자열을 위의 64개 문자로 표현하려고 하면 6비트(0-63까지 총 64개 : 2^6 = 64)가 필요하다.
즉 2진수의 값을 64진수로 변환한다고 생각하면 된다.
그런데 일반적으로 컴퓨터 데이터나 ASCII문자등은 8비트(1바이트)씩 묶여있다.
우리는 base64인코딩을 위해 문자열을 2진데이터를 6비트씩 묶어야 한다. 묶는 과정에서 혼란이 오지 않도록,
6과 8의 lcm(최소공배수), 즉 24비트씩 끊어서 묶도록 정한것이다.
이렇게 끊고보면 8비트단위일때 3바이트였던 문자열이 6비트단위의 '기본적인 64개의 문자 ' 4개로 치환된다는 걸 볼 수 있다.
예를들어보면, (위키피디아 example)
Man 이라는 문자열을 base64 인코딩하려 한다. 이걸 ASCII코드와 이진수값으로 묶어보고 6비트로 묶어보자.
문자열| M a n
ASCII | 77 97 110
binary | 01001101 01100001 01101110
6비트 묶음
010011 010110 000101 101110
몇번째? 19 21 5 46
base64 T W F u
(주의할점은 000000 이 A 로 변한다)
위와같이 문자열 Man 은 base64인코딩 후 TWFu 로 치환된다.
기본적인 원리는 간단하다. 문자열->ASCII binary ->6bit cut -> base64_encode
그런데 한가지 문제가 있다.
모든 문자열이 3개씩 남김없이 끊어지진 않는다는것이다.
그래서 padding 을 하는데, padding의 뜻 그대로 '불필요하게 넣은 군더더기' 라고 생각하면 된다.
만약 3개씩 끊어지지 않고 빈자리가 생긴다면 인코딩 후 패딩문자인 = 가 그 빈자리 만큼 들어가게된다.
즉, Many 라면 -> 77 97 110 121 -> 01001101 01100001 01101110 01111001
-> 010011 010110 000101 101110 011110 010000 (남는비트 뒤에 '0'을 채워 6비트 만듬)
-> TWFueQ 가 되고, 처음에 Man y-- 이므로 2개의 빈공간이 있음을 알려주기위해 패딩문자를 추가
-> TWFueQ== 가 base64 encoding의 최종 결과물이된다.
이런 패딩문자를 가지는 특징때문에 인크립트된 문자를 보고 문장 마지막에 = 가 한개 또는 두개있다면 BASE64 인코드되있는 문자라고 생각 할 수 있다.(물론 인크립트 전 문자가 3개씩 딱끊어져 패딩문자가 없을 수 있지만, 기본적인 64개의 문자로만 이루어진 암호문이라면 어느정도 예측 할 수 있다.)
이로써 base64의 원리는 모두 파헤쳤다. ㅋ;
아, base64 인코딩이 초기 문자보다 데이터의 크기가 더 커진다는 단점이 있는것 같지만,
위키의 설명처럼 웹상에서 공통적으로 사용할 수 있기때문에 많이쓰인다.
|