제목이 말하는 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

'학습자료(~2017) > 암호화' 카테고리의 다른 글

Base64 알고리즘  (0) 2012.01.10
RSA 공개키 암호 방식  (0) 2011.09.04

@ 공개키 암호 방식 ( Public key encryption system )


- 공개키 암호 방식에는 RSA, ElGamal, Merkle-Hellman의 Knapsack이 있다. 그 중 RSA에 대해서 알아 본다.




@ RSA ( Rivest Shamir Adleman)


- DES는 송신자와 수신자만이 알고 있는 동일한 대칭키를 이용하여 메시지를 암호화하고 복호화하고 있다. 이에 따른 문제점으로는


1. 키의 사전분배 문제


- 단체와 기업 같은 폐쇄적인 사용자들은 용이하나 인터넷 같은 개방형 시스템에서는 동일한 대칭키를 보유하는 것이 위험성이 있다.


2. 여러 사용자와 사용하려면 많은 수의 대칭키가 필요하게 되고 대칭키의 생성과 분배는 시스템의 효율성을 저하시키고, 많은 수의 대칭키의
유지, 관리가 어렵다.


- RSA는 서로 연관성이 있는 상이한 두 개의 키를 각각 암호화와 복호화에 이용한다.


- 송신자는 메시지 m을 공개키로 암호화하여 수신자에게 보내면 수신자는 자기만이 알고 있는 개인키로 복호화 한다.


- 모든 사용자는 자기만의 한 쌍의 공개키와 개인키를 가지며 공개키는 자기에게 메시지를 보내려는 사람에게 모두 제공해 주고, 개인키는 자신
만이 알고 있어야 한다.


- 공개키 암호 시스템은 키의 사전분배 문제를 해결하고, 디지털 서명과 같은 새로운 개념을 출현 시켰다.


- 큰 소인수의 곱을 인수분해 하는 수학적 알고리즘 이용




@ 공개키 암호 시스템은 일방향 함수를 이용


1. 일방향 함수


- x가 주어지면 y=f(x)의 계산이 용이한 반면, y가 주어졌을 때 x를 구하기 위한 f(x)의 역함수를 구하는 것이 불가능한 함수 f(x)를 말한다.

ex) 두 개의 매우 큰 소수의 곱 -> p와 q가 매우 큰 소수이면 n=p*q의 계산은 용이한 반면, 합성수인 n에서 p와q를 구하는 것은 아주 어려운 작업이다.


2. 공개키 암호 시스템은 이 일방향 함수를 이용한다. 즉 공개키로 암호화 하는 것은 f(x)는 용이하고, 수신자만이 알고 있는 비밀 키는 f(x)의 역함수를 구하는 비밀 통로의 역할을 한다.




@ RSA 공개 암호 시스템의 키 값의 구현


- RSA 공개키 암호에 사용될 공개키 {N,E}와 개인키 {N,D}를 생성하기 위해서는 먼저 모든 사용자들은 각각 다음의 작업을 수행


1. 두 개의 큰 소수 p와 q를 선정한 다음에 Modulus N = p * q와 PI(N)을 계산한다.


2. 공개키 E는 PI(N) = (p-1)(q-1)과 서로소의 관계가 되게 임의로 선정한다.


3. E*D mon PI(N) = 1의 관계에 있는 개인키 D를 “확장된 유클리드 알고리즘”으로 구한다.


4. {E,N}을 공개키로 공개하고, {D,N}을 개인키로 자신이 안전하게 보관한다.

- RSA 암호화 (암호화 하여는 수는 M)


E(M) = M ^ E mod N = C


- RSA 복호화


D(C) = C ^ D mod N = ((M^E)^D) mod N = M


ex) n = p*q = 47*71 = 3337 공개키 E는 (p-1)(q-1) = 46*70 = 3220과 서로소의 관계에 있는 임의의 정수 79로 선정한다. 따라서 개인키는 “확장된 유클리드 알고리즘”을 이용하여 d = 1019가 된다. 평문 m = 688은 암호문 c = 688^79 mod 3337 = 1570으로 암호화 된다. 개인키 d=1019를 사용하여 다시 암호문 c=1570은 평문 m=1570^1019 mod 3337로 복호화가 된다.





@ RSA의 대표적인 사용 예 -> 전자서명 (Digital Signature)




- 보통 어떠한 종이문서에 검수자의 서명이 되어 있으면 독자에게 신뢰를 줄 수 있다. 문서에 서명이 되어 있다는 것은 문서의 내용이 정확하고 누군가에 의해 검증이 되었다는 뜻이기 때문이다. 전자서명도 이와 마찬가지다. 차이점은 종이문서 대신 디지털 문서에 서명을 하는 것이다. 전자서명은 크게 서명(Signing)과 인증(Verification) 두 가지 과정으로 나뉜다. 서명은 문서가 검증되었음을 알리는 과정이고, 인증은 독자가 해당 문서에 서명이 되었는지를 확인하는 과정이다.


- 원리는 문서 데이터의 해쉬(hash)값을 비교해서 일치하는지 여부를 검증하는 것이다. 서명자는 문서의 데이터를 해쉬함수(hash function)를 통해 해쉬값을 생성하고, 생성된 해쉬값을 비밀키(Private Key)로 암호화한 후 문서에 첨부한다. 반대로 서명된 문서인지 검증하기 위해서 서명 부분을 따로 떼내어 공개키(Public Key)로 복호화하고, 문서에서 서명을 제외한 데이터를 다시 같은 해쉬함수를 통해 해쉬값을 얻어낸다. 두가지 값이 일치하는지 확인하여 일치하면 서명된 문서이고, 그렇지 않으면 서명되지 않은 문서인 셈이다.



출처 : http://marcof.tistory.com/59


참고할 자료 : ce.kyungil.ac.kr/~hskim/crypt7.ppt


서로소란 ?

서로소(서로素)는 일반적으로 어떤 두 대상이 공통으로 포함하는 값이 없는 경우를 의미한다.

  • 두 정수의 공약수가 1과 -1뿐인 경우, 두 정수는 서로소라고 한다.

'학습자료(~2017) > 암호화' 카테고리의 다른 글

Base64 알고리즘  (0) 2012.01.10
RSA 공개키 암호 방식  (0) 2011.09.04

+ Recent posts