Base64

ETC 2017. 3. 11. 01:42

Base64란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는

공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 말한다.


- 출처 : 위키백과




base64는 말 그대로 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

/


어떤 문장을 인코딩하는데에 위 64개의 ASCII 문자가 쓰인다.




인코딩 방식은 이렇다.


"abc" 이 세 문자를 인코딩한다고 하면,

a는 아스키코드로 '97', 이진법으로 '1100001'

b는 아스키코드로 '98', 이진법으로 '‭1100010‬'

c는 아스키코드로 '99', 이진법으로 '‭1100011‬'


세 문자를 8비트 이진수로 모두 나타내면

01100001 / 01100010 / 01100011

총 24비트가 된다.


이제 이것을 6비트씩 나누어주면 된다.

011000 / 010110 / 001001 / 100011


각 6비트는 0(000000)에서 63(111111) 사이의 값이 될 것이고,

나온 값을 위에 있는 64개의 ASCII 문자 중 값이 일치하는 문자로 바꾸어 주면 된다.

그래서 "abc"의 인코딩 결과는 "YWJj"가 된다.


Text

a

b

c

ASCII

97

98

99

Bit

0

1

1

0

0

0

0

1

0

1

1

0

0

0

1

0

0

1

1

0

0

0

1

1

Index

24

22

9

35

Encoded

Y

W

J

j




base64의 핵심은 8비트로 된 것을 6비트로 나눈다는 것이다!




"abc"의 경우는 24비트로, 8비트와 6비트로 모두 나누어 떨어졌지만

"abcd"의 경우는 어떨까??


"abcd"를 한 문자당 8비트 이진수로 나타내면

01100001 / 01100010 / 01100011 / ‭01100100‬

총 32비트가 된다.


이것을 6비트로 나누게 되면

011000 / 010110 / 001001 / 100011 / ‭011001 / 00 ???

마지막에 '00'이 남게된다.


base64는 6비트를 맞추기 위해 부족한 부분을 0으로 채워 넣는다.

011000 / 010110 / 001001 / 100011 / ‭011001 / 000000




그렇다면 "abcd"를 base64로 인코딩하면 "YWJjZA"가 되는 걸까?


아니다!!



base64는 24비트 그룹 수를 갖는다. 

따라서 문자를 이진수로 나타낸 총 비트 수가 24의 배수가 되어야한다.


011000 / 010110 / 001001 / 100011 / ‭011001 / 000000 / XXXXXX / XXXXXX

위 처럼 총 48비트로 맞춰져야 한다.


그럼 X에는 무엇이 들어가냐~?


X에는 '0'이 들어가게 된다.

하지만 앞에서 남은 '00'처럼 이를 A로 바꾸지 않는다.

대신 '=' 문자를 사용한다!


결국 "abcd"를 인코딩하게 되면 "YWJjZA=="이 되는 것이다.


Text

a

b

c

d



ASCII

97

98

99

100



Bit

0

1

1

0

0

0

0

1

0

1

1

0

0

0

1

0

0

1

1

0

0

0

1

1

0

1

1

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

Index

24

22

9

35

25

0



Encoded

Y

W

J

j

Z

A

=

=



'='으로 채워지는 것을 base64 패딩이라고 한다.

우리는 '='을 보고 base64로 인코딩 됐구나! 라고 쉽게 추측할 수 있다.



하지만 이 패딩때문에 base64 디코딩하는 데에서 문제가 생긴다.


"YWJjZA=="와 "YWJjZB=="를 디코딩해보면 모두 "abcd"로 나온다!

왜일까?


디코딩을 하는 과정에서 '00' 뒤에 붙은 '0'과 패딩으로 붙은 '0'(빨간 글씨 부분)은 모두 버려지게 된다.


Text

a

b

c

d



ASCII

97

98

99

100



Bit

0

1

1

0

0

0

0

1

0

1

1

0

0

0

1

0

0

1

1

0

0

0

1

1

0

1

1

0

0

1

0

0

0

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

Index

24

22

9

35

25

1



Encoded

Y

W

J

j

Z

B

=

=


따라서 똑같이 "abcd"가 된다.




base64 인코딩 및 디코딩 사이트

http://ostermiller.org/calc/encode.html