Base64는 기본적으로 64진수(2^6, 6비트)로 모든 정보를 표현하고자 하는데 있다.
그런데, 컴퓨터에서 한 문자는 8비트로 표현이 된다.
따라서, 6과 8로 나누어 떨어질 수 있는 최소공배수 24비트로 문자열을 처리단위가 결정 된다.
24비트란 크기는 Base64에서 다루게 될 6비트 기준으로는 4바이트가 되고,
흔히 컴퓨터에서 일컬어지는 문자의 단위인 8비트 기분으로는 3바이트가 된다.
따라서 Base64 인코딩은 다른 표현으로 3-to4 인코딩이라 하기도 한다
다시 대충 정리 하면
- Base64 인코딩
- MiMe에 주로 사용
- Web인증 중 하나인 기본인증(Base Authentication)에도 사용됨
- 2진 데이터를 ASCII 형태의 텍스트로 표현가능
- Base64 구성
- 64개의 문자로 구성됨
- 알파벳 대문자 : 26자
- 알파벳 소문자 : 26자
- 숫자 : 10자
- 특수문자 : + / 2자
- 6Bit로 한 문자를 표현
- =는 Padding 값으로 사용
그럼 문자열 KIM을 Base64 인코딩 해보자. 우선 KIM 문자열에 대한 2진수값을 구해야한다.
KIM의 HEX값은 4B(K) 49(I) 4D(M) 이므로, 이것을 다시 2진수로 변환하면
0100 1011 (K) 0100 1001 (I) 0100 1101 (D) 이 된다.
KIM(16) → 4B 49 4D
KIM(2) → 0100 1011 0100 1001 0100 1101
KIM의 2진수을 6비트 단위로 다시 잘라서 계산한다
KIM(2) → 0100 1011 0100 1001 0100 1101
KIM(6) → 010010 110100 100101 001101
KIM(6) → 18 52 37 13
KIM(Base64)→ S 0 I N
아래 변환 테이블을 참고 하여 대입해보면 알수 있다
즉, 18은 18번째의 ASCII값, 52번은 52번째... 이런 의미
10진수 | ASCII | 2진수 | 10진수 | ASCII | 2진수 |
0 | A | 000000 | 32 | g | 100000 |
1 | B | 000001 | 33 | h | 100001 |
2 | C | 000010 | 34 | i | 100010 |
3 | D | 000011 | 35 | j | 100011 |
4 | E | 000100 | 36 | k | 100100 |
5 | F | 000101 | 37 | l | 100101 |
6 | G | 000110 | 38 | m | 100110 |
7 | H | 000111 | 39 | n | 100111 |
8 | I | 001000 | 40 | o | 101000 |
9 | J | 001001 | 41 | p | 101001 |
10 | K | 001010 | 42 | q | 101010 |
11 | L | 001011 | 43 | r | 101011 |
12 | M | 001100 | 44 | s | 101100 |
13 | N | 001101 | 45 | t | 101101 |
14 | O | 001110 | 46 | u | 101110 |
15 | P | 001111 | 47 | v | 101111 |
16 | Q | 010000 | 48 | w | 110000 |
17 | R | 010001 | 49 | x | 110001 |
18 | S | 010010 | 50 | y | 110010 |
19 | T | 010011 | 51 | z | 110011 |
20 | U | 010100 | 52 | 0 | 110100 |
21 | V | 010101 | 53 | 1 | 110101 |
22 | W | 010110 | 54 | 2 | 110110 |
23 | X | 010111 | 55 | 3 | 110111 |
24 | Y | 011000 | 56 | 4 | 111000 |
25 | Z | 011001 | 57 | 5 | 111001 |
26 | a | 011010 | 58 | 6 | 111010 |
27 | b | 011011 | 59 | 7 | 111011 |
28 | c | 011100 | 60 | 8 | 111100 |
29 | d | 011101 | 61 | 9 | 111101 |
30 | e | 011110 | 62 | + | 111110 |
31 | f | 011111 | 63 | / | 111111 |
하지만 여기서 끝이 아니다.
모든 글자들이 딱딱 떨어지면 좋겠지만 그런것이 아니다 그래서 패딩을 이용하여 글자를 인코딩한다
딱 안떨어지는경우는 2경우가 있다.
먼저 처음으로
Hill을 16진수로 변환 하면 0x48, 0x69, 0x6C, 0x6C가 되고 다시 2진수로 바꾸어 보면
01001000 01101001 01101100 01101100 가 된다. 그럼 6비트씩 잘라보면
010010 000110 100101 101100 011011 00 24비트단위가 되야 하는데 32비트다..
그럼 48비트로 만들어야 하는데 16비트가 부족하다 마지막에 0으로 채워 넣어 보자
010010 000110 100101 101100 011011 00 0000 000000 000000 이 된다 10진수로 변환 해보면
18, 6, 37, 44, 27, 0, 0(패딩), 0(패딩) 이 된다
굶은0은 실제로 있던값이고 뒤에 0은 48비트를 만들기위해 붙여진거라 서로 틀린것이다
그래서 패딩(0)으로 채워진 영역은 " = "으로 쓰는것이다.
S, G, I, s, b, A, =, =
즉, Hill은 Base64로 인코딩하면 SGIsbA== 가 된다
2번째로
Choiw을 16진수로 변환 하면 0x43, 0x68, 0x6F, 0x69, 0x77이 된다 2진수로 바꾸면
01000011 01101000 01101111 01101001 01110111 되고 6비트씩 자르면
010000 110110 100001 101111 011010 010111 0111
24비트단위가 되어야 하는데 40비트 그럼 48비트로 하려면 8비트가 부족하다 이것역시 마지막에 0을 채운다
010000 110110 100001 101111 011010 010111 011100 000000 이 된다 10진수로 변환 하면
16, 54, 33, 47, 26, 23, 28, 0(패딩) 이 된다 역시 패딩영역만 " = " 하면
Q, 2, h, v, a, X, c, =
즉, Choiw을 Base64로 인코딩하면 Q2hvaXc= 가 된다
그래서 정리해보면 패딩(=)은 문자들이 딱떨어지면 없는경우와 하나인경우, 두개인경우가 존재 한다.
개인적으로 공부 하려고 글 정리 하다가 엄청 길어졌다 +_+
이런식으로 이론을 어느정도 알고 나중에 급하게 사용할때는
http://oxtag.com/php/p/base64-converter.php
http://home2.paulschou.net/tools/xlate/
이런 변환사이트나 툴을 이용하면 딱!! 위에 가서 내가 인코딩한게 맞는지 테스트 해보는것도!!