Yenarue's Log Generalist Software Engineer :-)

[암호/기초] Base 64에 대하여

|

이 포스팅은 기존 개발 블로그에서 백업한 포스팅입니다.

  • 원문 : https://syung1104.blog.me/161866114

Base64

바이너리나 압축파일과 같은 8비트 이진 데이터를 문자코드에 영향을 받지않는 공통 ASCII문자들로만 이루어진 문자열로 바꾸는 인코딩 방식을 말한다.

64가지의 문자를 이용하여 바이너리 데이터를 ASCII텍스트 데이터로 표현하게 된다.

즉, 64진법으로 인코딩하는 방식인데, 이는 64진법이 ASCII문자를 나타내기에 가장 적합한 숫자이기 때문이다.

Base64의 구성

기본적으로는 A~Z (26개) + a~z (26개) + 0~9 (10개) = 총 62개의 문자로 구성되며, 나머지 2개에 어떤 기호를 사용하는지에 따라 base64의 종류가 결정된다. 대부분의 경우 +와 /가 쓰인다.

8bit의 바이너리 데이터를 6bit의 크기를 단위로 표현한다!

즉, input은 1개의 문자크기인 8bit를 단위로 3개의 문자를 기본으로 하며 이것을 6bit단위로 표현하게 되므로 그에따른 output은 4개의 문자를 얻게된다는 것이다.

따라서 24bit를 단위로 3개의 문자를 인코딩하면 4개의 문자를 얻게된다!

그렇다면 만약 8bit의 데이터(문자 하나)를 input으로 base64암호화를 시킨다면 output은 어떻게될까?

64진수수가 하나(6bit)가 출력되고 나머지 2bit는 padding문자로 채워지게된다.

  • padding문자는 base64 table에 존재하지 않는 기호인 = 이다.

위에서 언급했다시피, =는 bit수를 맞춰주기위해 0으로 채워주는 padding이다.

그러므로 문자의 갯수가 3n+1개 일 때에는 =이 2개로 채워질 것이고, 3n+2개 일 때에는 =이 1개로 채워질 것이다.

그림으로 보는 Base64 인코딩

간단하게 인코딩 방식을 그림으로 설명해보겠다.

문자 a 를 Base64로 인코딩 할 때 변환되는 모습을 도식화 해보았다 :

img

8비트의 문자 3개가 6비트 단위로 쪼개진 문자 4개로 변환되었다!

기본 포맷이 24비트이므로 a를 input하면 첫글자 부분에 8bit인 01100001가 들어가고

나머지 두글자 부분에는 0으로 채워지게 되며 이것을 6비트씩 잘라서 아스키부호로 다시 표현한다.

뒷 부분의 0값 들은 인코딩시 padding부호 =로 변환된다.

실제로 인코딩을 해보자!

실제로 Base64 인코딩을 지원하는 툴 “SND Reverser Tool”을 사용하여 문자 a를 base64로 직접 인코딩 해보자!

a 를 인코딩해보기

원본 Base64 인코딩 후
img => img

위와 같이 길이 1(3n)의 a 문자열을 인코딩하면 padding문자(=)가 2개 들어가는 것을 알 수 있다.

ab 를 인코딩해보기

원본 Base64 인코딩 후
img => img

위와 같이 길이 2(3n+2)의 ab 문자열을 인코딩하면 padding문자(=)가 1개 들어가는 것을 알 수 있다.

abc를 인코딩해보기

원본 Base64 인코딩 후
img => img

abc 는 길이가 3(3n)이므로 padding문자 없이 모두 ASCII문자로 변환되는것을 알 수 있다.

[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 /

참고 사이트

Comments