Base64 원리 2

Development/Common 2012. 4. 11. 12:21

base64 인코딩 ,디코딩의 원리

1. 써보셨나요?
사용해야
경우는 많겠지만.. 저는 이럴 써요.
 - 웹에서 GET 파라미터로 넘길
 - 한글 데이터가 기종 시스템간 이동하면서 변조되지 않도록 하기 위해서
   (요곤 조금 설명이 필요해요.. 다른 포스트에서 다루던가 아님 덧글 주세요.)

2. 그럼 원리는 아시나요?

base64 64진수라는 뜻입니다.
, base64 인코딩이란, 현재 시스템에서 사용하는 2진수 데이터를 64진수 데이터로 변경해서 표현하겠다는 것이죠.

아시다시피
64 2^6 이지요. 데이터의 단위를 6bit으로 표현하겠다는 겁니다.
그런데
, 일반적으로 컴퓨터는 byte라고 하는 8bit 기준으로 데이터를 표현하는 것이 일반적입니다.
결론적으로
약간 수학적으로 정리하자면, 8bit으로 표현하는 데이터를 6bit으로 표현하겠다는 것이지요.

그럼
이제 조금만 설명해보겠습니다.
아래의
표를 참조하세요.



step1) 먼저 예를 들면 "abc" 8bit 문자로 구성된 byte 문자열 입력입니다.
step2) 그럼 값은 문자를 의미하는 8 bit 이진값으로 표현이 됩니다.
step3) 이를 6bit 단위로 다시 구분해 봅니다.
step4) 이를 base64 문자셋으로 변환합니다.
          여기서 base64 문자셋이란 a-z, A-Z, 0-9, +, / 이루어진 문자셋입니다.
          A ~ Z : 0 ~ 25
          a ~ z : 26 ~ 51
          0 ~ 9 : 52 ~ 61
          +       : 62
          /       : 63
step5)
만일 떨어지지 않으면 어쩌죠?
BASE64 인코딩은 24bit 단위로 항상 수행합니다. (24 8 6 최소공배수입니다.)
그래서
, 남는 비트가 생기면 뒤에 6bit character 0으로 padding 합니다. (예제의 Q 인코딩 하는..)
그리고나서도
남는 6bit character = 으로 치환합니다.




3) 그럼 코드로 만들면 어떻게 될까요?
C 만든 코드를 구해서 포스팅 했습니다. 확인하세요~
http://www.iamcorean.net/125

 

출처 - http://www.iamcorean.net/130

 

================================================================

 

우선 제목이 말하는 Base64의 의미가 무엇인지 살펴 보자.


베이스가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는
2^6 = 64 즉 6 비트 2진수 열이 필요하다.

그런데 대개 컴퓨터에서 가장 기본이 되는 정보 단위는 8 비트씩 엮어진 바이트이므로
6비트와 8비트가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24비트가 된다.

24비트는 8비트 바이트에서는 3바이트가 되고, 64진수로 나타내기 위한 6비트 단위로는 4 단위가 된다. (바이트라고 반복하기 말하면 혼동이 될 것 같아서 "단위"라는 말로 대치하였다.)

따라서 Base64의 인코딩 원리는 3바이트 단위마다 (즉 24비트 마다) 6비트씩 쪼개어서 6비트 짜리 문자 4개로 만드는 것이 되겠다.

이 때 6비트씩 쪼개진 단위를 A-Z a-z 0-9 +- (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.

Base64 Encoding/Decoding


그런데 입력되는 정보가 모두 3바이트씩 떨어진다는 보장이 없으므로 3바이트로 나누어떨어지지 않는 경우 = 문자로 채우기를 한다. 즉 Base64로 인코딩 된 데이타에서 = 가 보이면 그 것은 다시 원래의 정보로 되돌아 갈때 (디코딩 될때) 아무 것도 없는 것이라는 소리가 된다.
(Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개가 되겠다. 즉 끝부분에 =가 없거나 1개가 있거나 2개가 있는 것이 모두 나올 수 있는 경우가 되겠다.)

디코딩은 A-Z a-z 0-9 +- 문자를 각각 6비트의 정보로 바꾸어서 4 단위 (6*4=24 비트) 마다 합쳐서 3바이트 (3*8=24 비트) 로 다시 복원시키면 된다.

이러한 2진수 데이터를 64진수형으로 변환하여 64개의 아스키 코드에 대입하는것이 Base64 알고리즘의 기본이다. 또한 이런 변환을 하는 이유는 암호화에도 있겠지만 보통은 안전한 64개의 아스키문자열로 변환하여 원할한 데이터를 전송하는데 있다. 예를 들자면 한국어의 경우 2바이트 문자열로 그대로 전송할시 문자열의 깨짐이 발생 할 수 있다. 이는 데이터 전송시 원하지 않는 결과이며 이러한것을 막기 위해 안전한 아스키코드 문자로 변환하여 전송 하는것이다. 보통 이러한 Base64인코딩 디코딩은 이메일 전송시 많이 사용된다. 하지만 데이터가 기존의 데이터보다 약 30%이상 커진다는 단점이 있다.
 그럼 일반 문자열을 Base64로 인코딩은 어떻게 하면 될까? 답은 다음의 스텝대로 시도하면 된다.

  1. 소스의 바이너리 데이타로 부터 3바이트씩 꺼낸다. 만약 나머지 소스 문자열이 3바이트가 되지 않는다면 0으로 채운다.
  2. 최초 바이트의 MSB를 6비트씩 4개의 숫자로
  3. 각각의 수치를 하단의 표를 토대로 아스키 문자로 변환한다. 다만 실제의 데이터 길이가 3바이트에 미치지 못한다면 '='로 대체 한다.
  4. 이후 데이터가 없어질때까지 1~3을 반복한다.

**64 bit 수치와 아스키 문자의 대응***

6-bit Value

Encoding

6-bit Value

Encoding

6-bit Value

Encoding

6-bit Value

Encoding

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

/

 

출처 - http://huikyun.tistory.com/70

'Development > Common' 카테고리의 다른 글

Alpha, Beta 버전  (0) 2012.04.27
문자 바이트 수 계산기  (0) 2012.04.12
unreachable code  (0) 2012.03.12
main 함수  (0) 2012.03.07
프로그램 소스코드를 공개하는 사이트  (0) 2012.03.07
Posted by linuxism
,