2015년 1월 15일 목요일

Base64란?


Base64

Base64 인코딩은 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.
Base64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 64가 2의 제곱수(64 = 2^6^)이며, 2의 제곱수들에기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다.
 
즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다. 그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다.
일반적으로 Base64는 바이너리 데이터를 문자열로 변환 해 준다고 생각하면 된다. 변환 되는 문자열을 다음과 같이 64개의 문자로 이루어진다.

            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 

위에서 볼 수 있듯이 64개의 문자는 A~9까지 일반적인 알파벳 대소문자와 숫자 그리고 "+" 와 "/" 
두가지의 기호로 이루어진다.


Base64 인코딩 과정

  1. 바이너리 데이터는 아래와 같이 8bit씩 나누어져 있다
  • 00110011 | 01110010 | 01101011 | 00001010
     
  2. 이를 아래와 같이 6bit씩 나누어 묶어 준다 
      (왜 6bit인가? 이유는 64개의 문자이기때문에 2^6^으로 표현할 수 있기때문이다)
  • 001100 | 110111 | 001001 | 101011 | 000010 | 10
     
  3. 그런데.. 다 나누어보았더니 마지막에 "10"이 남는다. 6bit로 이루어져야 하는데.. 이것은 어찌해야 할까? 
      (정답은 남은부분을 "0"으로 채워주는 것이다)
  • 001100 | 110111 | 001001 | 101011 | 000010 | 10 0000 
  • 위와같이 "0"으로 채워주는 경우가 있을때에는 남는 bit에 따라서 패딩문자 "=" 한개 또는 "==" 두개를 붙여준다. (2bit가 남으면 "=" , 4bit가 남으면 "==")
     
  4. 6bit로 나눠진 비트들을 각각 정수로 변환해 위의 64개의 문자(첫번째부터 차례대로 0 ~ 63)에 맞춰 문자를 
      만들어준다.




Example

"Pointi"라는 글자를 Base64 인코딩을 해보자.

1. 먼저 각각의 문자를 2진수(8bit)로 변환한다.



2. 만들어진 2진수 값들은 아래와 같다.
01010000 | 01101111  | 01101001 | 01101110 | 01110100 | 01101001

3. 이것들은 6bit로 나눠준다.
010100 | 000110 | 111101 | 101001 | 011011 | 100111 | 010001 | 101001

4. 나눠진 6bit로 이루어진 2진수는 아래와 같이 정수로 바꿔준다.
20  |  6  |  61  |  41  |  27  |  47  |  17  |  41

5. 아래의 표에 맞춰 문자를 만들어준다.


6. 결과는 UG9pbnRp 이다.

댓글 2개: