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로 인코딩되었다고 유추해볼 수 있다.