Computer2009. 5. 26. 01:49

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/

이런 변환사이트나 툴을 이용하면 딱!!   위에 가서 내가 인코딩한게 맞는지 테스트 해보는것도!!



Posted by 샤키