본문 바로가기

Secure Note

md5

MD5(Message-Digest algorithm 5)
128비트 암호화 해쉬함수. 컴이 구리던 시절에는 상당히 안전하다고 평가됬지만, 컴퓨터의 발전으로 해쉬크래시를 통한 md5의 크랙이 가능해졌다. 때문에 현재는 보안관련 용도로는 권장하지 않지만, 여전히 구현이 간단하다는 장점을 내세워 사용하는 곳이 많다. 네이트온의 비밀번호 유출의 경우도 md5를 사용해서 피를 본 사례이다.

md5의 가장 큰 특징은, 어떤길이의 문자라도 128비트로 만들어서 출력시킨다는 점이다.

md5 알고리즘
1. 메세지를 512 비트씩 끊어내어야 한다. (끊어진 비트들을 블럭이라고 부른다.)
1.1 만약 512로 나누어떨어지지 않으면 패딩을 해야하는데,
1.2 우선 모자라는 공간의 첫 비트를 1 로 채우고, 
1.3 그다음 512배수보다 64비트 적은 비트까지 0으로 채운다.
1.4 마지막 64비트는 원본 메세지의 길이를 64비트 정수로 나타내서 채운다.

2. 하나의 블럭(512)을 32비트 워드인 네게의 공간에 일정한 루틴을 가지고 담게된다.(512->128로 변하게 됨)
2.1 각 워드들은 일정한 초기값을 가지고 시작하는데,
A : 01 23 45 67
B : 89 ab cd ef
C : fe dc ba 98
D : 76 54 32 10
    이다.(RFC 1321 문서 기준) 아, 사실은 cpu가 리틀엔디안인지 빅엔디안인지 잘 따져서 값을 정해줘야 한다.
    하지만, 개념만 보기때문에 위의 초기값이라고 하자(위는 빅엔디안일때... 일꺼다 아마)
3. 네개의 워드에 512비트를 우겨넣는 방법은 4단계로 나뉜다. 각 단계를 round라고 함
 각 라운드는 비선형함수 F, 모듈라 덧셈, 레프트로테이션에 기반한 16개의 동일연산으로 이루어짐
 각 단계는 서로다른 비선형함수F를 사용함
F(X,Y,Z) = (X∧Y)∨(X'∧Y)
G(X,Y,Z) = (X∧Z)∨(Y∧Z')
H(X,Y,Z) = X※Y※Z //※는 xor (모양을 못찾겠음..)
I(X,Y,Z) = Y※(X∨Z')

이렇게 단계를 거치면 4 워드(128비트)에 우겨넣어지고, 각 블럭에 대해서 이런 과정을 반복하면 최종적으로 4 워드(128비트)의 

md5 해쉬값이 나오게된다.
(각 블럭은 이전 블럭의 연산결과인 4 워드의 값을 기반으로 다시 연산하는 식이다.)

4워드를 이용한다는 특징 때문에 16진수(123456789abcdef) 로만 이루어져있다. (이를 보고 암호화 종류 파악 가능)

'Secure Note' 카테고리의 다른 글

xss 우회  (0) 2012.03.09
free web proxy site  (0) 2012.03.07
레지스트리 보기(1)  (0) 2011.11.05
RSA - source  (0) 2011.10.26
암호학 기본(개론... 이랄까)  (0) 2011.10.26