본문 바로가기

암호학/개념

Base64

Base64는 Binary 데이터를 아스키 코드 일부와 일대일로 매칭되는 문자열로 단순 치환되는 인코딩 방식이다. 

Base64는 알파벳 A~Z까지 대소문자 52개와 숫자 10개, 특수 문자 + , / 이렇게 64개로 이루어져있다.

 

문자 문자 문자 문자
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 /

 

원칙은 인코딩 될 문자열을 6 비트로 끊고(64개 문자로 표현), 인코딩 될 문자열의 총 Bit 수를 3으로 나눈 나머지 수만큼 '=' 로 Padding 한다는 것이다. 이것은 원본으로 되돌릴 때 원본에는 없던 비트가 생기는 것을 방지하기 위함이다.

 

예를 들어 'apple'이라는 단어를 인코딩해보겠다.

 

apple //문자열
1. 97 112 112 108 101 //ASCII로 변환
2. 0110 0001 0111 0000 0111 0000 0110 1100 0110 0101 // ASCII to BINARY
3. 011000 010111 000001 110000 011011 000110 0101  //6bit 씩 재배치

4. 24 27 1 48 27 6 5 //bit를 정수로 변환

5. YXBwbGU //변환 된 값들을 위의 Base64 테이블을 참조해 문자열로 변환

5. 3번에서 전체 bit 개수는 40 이며 mod 3연산을 하면 1이 남음으로 '=' 하나를 추가(문자열의 총 Bit 수를 3으로 나눈 나머지수만큼 '=' 로 Padding으로 들어간다.)

 

결과: YXBwbGU=

 

디코딩하는 방법은 인코딩의 반대 순서로 진행하면 된다.

 

Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개이다. 즉 끝부분에 =가 없거나 1개가 있거나 2개가 있을 수 있다. (왜냐하면 6bit를 mod 3에서 최대 몫이 2가 나오기 때문이다.)

Base64는 맨 마지막 문자가 경우에 따라 없을 수 있지만 큰 확률로 =, ==으로 끝나게 된다. (66.66666%)

따라서 해당 부분을 숙지하고 있다면 이 인코딩된 문자가 Base64로 인코딩되었다고 유추해볼 수 있다.