20 March 2014

들어가기 전에

Base64알고리즘에 대해서는 많이 말하고 많이 듣기도 하였지만 실제로 어떻게 알고리즘이 사용되는지 알지 못하였습니다. 최근에 개인적으로 애플에서 결제 영수증에서 내려오는 데이터가 Base64로 인코딩이 되어 있는데 이것을 검증하지 못하여 약간 시간이 소모되는 경우도 있었습니다.

Base64

Base64라는 의미는 64진법이라는 의미입니다. 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문입니다. 그런 이유로 Base64는 전자 메일을 통한 이진 데이터 전송에 많이 쓰이고 있습니다. 대개 처음 62두개는 A-Z, a-z, 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있습니다.

Base64 색인표

문자 문자 문자 문자
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /


Base64의 정확한 규격은 RFC 1421, RFC 2045에 정의됩니다. 연속된 8 비트 바이트를 인코딩하도록 정의되어 있습니다.

인코딩된 결과물은 원본보다 4/3 정도 늘어나게 됩니다.

Base64 인코딩

  1. 24비트 버퍼에 가장 위쪽 비트부터 한 바이트씩 세 바이트를 넣습니다.

  2. 남은 바이트가 3바이트 미만이라면 버퍼의 남은 부분을 0으로 채워넣게 됩니다.

  3. 버퍼의 위쪽부터 6비트로 잘라 그 값을 읽어 Base64색인표에서 그 문자를 출력합니다.

  4. 입력된 바이트가 하나라면 출력은 두개만 되고 나머지 둘은 “=”으로 패딩됩니다.


Base64 인코딩 예제:

문자 입력 : AB
A, B의 ASCII 값 : 65, 66
A, B의 2진법 : 0100 0001, 0100 0010
한 바이트씩 24비트 버퍼에 집어 넣으면 다음과 같은 형식로 구성됩니다.
base64-progess 인코딩 문자열 : QUI=

Base64 디코딩

  1. 인코딩된 문자열을 Base64색인표에서 찾아 해당 값의 2진법으로 표시합니다.

  2. 24비트 버퍼에 가장 위쪽 비트부터 6비트씩 4개의 값를 넣습니다.

  3. 24비트 버퍼를 8비트로 잘라 그 값을 ASCII로 읽습니다. 만약 값이 =으로 패딩되었다면 제외합니다.

  4. ASCII를 다시 문자열로 읽어 출력합니다.


Base64 디코딩 예제:

인코딩된 문자열 : REU=
REU=의 색인 값 : R - 17, E - 4, U - 20
2진법으로 변환 : 010001, 000100, 010100
8비트로 분리 : 01000100, 01000101, 00000000
10진수로 변환 : 68, 69
디코딩 문자열 : DE

참고 문서