MD5란 무엇입니까?

md5의 전체 이름은 메시지 다이제스트 알고리즘 5(Message-Digest Algorithm)이며 1990년대 초 MIT 컴퓨터 과학 및 RSA 데이터 보안 연구소의 Ronald L. Rivest가 개발했습니다. md2 및 md3 md4에서 개발되었습니다. 그 기능은 디지털 서명 소프트웨어로 개인 키에 서명하기 전에 대용량 정보를 기밀 형식으로 "압축"(즉, 임의 길이의 바이트 문자열을 특정 길이의 큰 정수로 변환)할 수 있도록 하는 것입니다. md2, md4 또는 md5인지에 관계없이 모두 임의의 길이의 정보를 얻고 128비트 정보 다이제스트를 생성해야 합니다. 이러한 알고리즘의 구조는 다소 유사하지만 md2의 디자인은 md4 및 md5와 완전히 다릅니다. 이는 md2가 8비트 컴퓨터용으로 설계되고 최적화된 반면 md4 및 md5는 32비트 컴퓨터용으로 설계되었기 때문입니다. 이 세 가지 알고리즘에 대한 설명과 C 언어 소스 코드는 인터넷 RFCS 1321(hp://www.ietf.org/rfc/rfc1321.txt)에 자세히 설명되어 있습니다. 이 문서는 Ronald L이 작성한 가장 권위 있는 문서입니다. rivest는 1992년 8월에 ieft에 제출되었습니다.

Rivest는 1989년에 md2 알고리즘을 개발했습니다. 이 알고리즘에서는 정보의 바이트 길이가 16의 배수가 되도록 정보가 먼저 데이터로 채워집니다. 그런 다음 16비트 체크섬이 메시지 끝에 추가됩니다. 그리고 새로 생성된 정보를 기반으로 해시 값을 계산합니다. 나중에 rogier와 chauvaud는 체크섬이 생략되면 md2 충돌이 발생한다는 사실을 발견했습니다. md2 알고리즘의 암호화된 결과는 고유하며 중복이 없습니다.

알고리즘의 보안성을 강화하기 위해 rivest는 1990년에 md4 알고리즘을 개발했습니다. 또한 md4 알고리즘은 정보의 바이트 길이에 448을 더한 값이 512로 나누어질 수 있도록 정보를 채워야 합니다(정보 바이트 길이 mod 512 = 448). 그런 다음 메시지의 원래 길이에 대한 64비트 이진 표현이 추가됩니다. 정보는 512비트 damgörd/merkle 반복 블록으로 처리되며, 각 블록은 세 가지 다른 단계로 처리됩니다. Den Boer와 Bosselaers 등은 md4 버전의 첫 번째 및 세 번째 단계를 공격하는 취약점을 빠르게 발견했습니다. Dobbertin은 일반 PC를 사용하여 몇 분 안에 md4 정식 버전에서 충돌을 찾는 방법을 보여줍니다(이 충돌은 실제로 콘텐츠의 암호화는 다르지만 암호화는 동일한 결과로 이어지는 취약점입니다). md4가 제거되었다는 것은 의심의 여지가 없습니다.

md4 알고리즘은 이렇게 큰 보안 허점이 있음에도 불구하고 이후 개발된 여러 정보보안 암호화 알고리즘의 등장에 있어서 무시할 수 없는 길잡이 역할을 하고 있다. md5 외에도 더 유명한 것에는 sha-1,rip-md 및 haval이 있습니다.

1년 후인 1991년에 rivest는 기술적으로 더욱 성숙한 md5 알고리즘을 개발했습니다. md4에 "안전 벨트"라는 개념을 추가합니다. md5는 md4보다 약간 느리지만 더 안전합니다. 이 알고리즘은 분명히 md4 설계와 약간 다른 4단계로 구성됩니다. md5 알고리즘에서 메시지 다이제스트의 크기와 패딩에 필요한 조건은 md4와 정확히 동일합니다. Den Boer와 Bosselaers는 md5 알고리즘에서 의사 충돌을 발견했지만 그 외에는 발견된 암호화 결과가 없었습니다.

van Oorschot와 Wiener는 해시에서 충돌을 검색하는 무차별 해시 함수를 고려했으며 md5 충돌을 검색하도록 특별히 설계된 기계(이 기계(1994년 제조 비용은 약 100만 달러), 24일마다 평균 1건의 분쟁이 발견되었습니다. 하지만 1991년부터 2001년까지 10년 동안에는 md5 알고리즘을 대체한 md6이나 다른 이름으로 불리는 새로운 알고리즘이 나오지 않았음에도 불구하고 이 결함이 md5의 보안에 큰 영향을 미치지 않는다는 것을 알 수 있습니다. 위의 모든 사항은 실제 응용 프로그램에서 md5의 문제가 되기에는 충분하지 않습니다. 더욱이, md5 알고리즘을 사용하면 저작권료를 지불할 필요가 없기 때문에 일반적인 상황(극비밀 응용 분야가 아닌 경우)에서는 md5를 극비 분야에 적용하더라도 md5는 매우 위험한 것으로 간주될 수 있습니다. 우수한 중간 기술), 어떻게 md5가 가능합니까? 매우 안전한 것으로 간주되어야합니다.

알고리즘 적용

md5의 일반적인 적용은 변조를 방지하기 위해 정보(메시지)에 대한 메시지 다이제스트(message-digest)를 생성하는 것입니다. 예를 들어, Unix에서 많은 소프트웨어를 다운로드하는 경우 모두 동일한 파일 이름과 파일 확장자가 .md5인 파일을 가지고 있습니다. 이 파일에는 일반적으로 한 줄의 텍스트만 있으며 일반적인 구조는 다음과 같습니다.

md5 ( tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461

이것은 tanajiya.tar.gz 파일의 디지털 서명입니다. md5는 전체 파일을 큰 텍스트 메시지로 처리하고 되돌릴 수 없는 문자열 변환 알고리즘을 통해 이 고유한 md5 메시지 다이제스트를 생성합니다. 향후 본 파일을 배포하는 과정에서 어떤 방식으로든 파일의 내용이 변경되더라도(사람의 수정이나 다운로드 과정에서 불안정한 라인으로 인한 전송 오류 등을 포함) 다음과 같이 알게 되실 것입니다. 이 파일의 md5를 다시 계산하면 정보 다이제스트가 다르기 때문에 잘못된 파일을 얻었음을 확신할 수 있습니다. 제3자 인증 기관이 있는 경우 md5를 사용하면 파일 작성자의 "부인"도 방지할 수 있습니다. 이것이 소위 디지털 서명 응용 프로그램입니다.

MD5는 암호화 및 복호화 기술에도 널리 사용됩니다. 예를 들어 Unix 시스템에서는 사용자의 비밀번호가 md5(또는 기타 유사한 알고리즘)를 사용하여 암호화되어 파일 시스템에 저장됩니다. 사용자가 로그인하면 시스템은 사용자가 입력한 비밀번호를 md5 값으로 계산한 후, 이를 파일 시스템에 저장된 md5 값과 비교하여 입력한 비밀번호가 맞는지 판단한다. 이러한 단계를 통해 시스템은 사용자 비밀번호의 명확한 코드를 알지 못한 채 사용자의 시스템 로그인 적법성을 결정할 수 있습니다. 이는 시스템 관리자 권한을 가진 사용자가 사용자의 비밀번호를 알 수 없게 할 뿐만 아니라 비밀번호 크래킹의 난이도를 어느 정도 높여줍니다.

해커들이 가장 많이 사용하는 비밀번호 해독 방법 중 하나가 '사전 실행'이라는 방법인 것도 이 때문이다. 사전을 얻는 방법에는 두 가지가 있는데, 하나는 비밀번호로 사용되는 문자열 테이블을 매일 모아서 생성하는 것이고, 다른 하나는 먼저 md5 프로그램을 사용하여 이들 사전의 md5 값을 계산하는 것입니다. 항목을 사용하고 대상 md5 값을 사용하면 이 사전에서 검색됩니다. 비밀번호의 최대 길이는 8바이트이고, 비밀번호는 문자와 숫자, ***26 26 10=62자만 가능하며, 순열로 구성된 사전의 항목 수는 p(62, 1)라고 가정합니다. ) p(62, 2)…. p(62, 8), 이는 이미 천문학적인 숫자입니다. 이 사전을 저장하려면 테라바이트급 디스크 배열이 필요하며 이 방법에도 전제 조건이 있습니다. 대상 계정 비밀번호의 md5 값을 얻은 경우에만 가능합니다. 이 암호화 기술은 Unix 시스템에서 널리 사용되며, 이는 Unix 시스템이 일반 운영 체제보다 더 견고한 중요한 이유입니다.

알고리즘 설명

md5 알고리즘에 대한 간략한 설명은 다음과 같습니다. md5는 입력 정보를 512비트 그룹으로 처리하며, 각 그룹은 16개의 32비트 하위 그룹으로 나뉩니다. 일련의 처리 후에 알고리즘의 출력은 4개의 32비트 그룹으로 구성됩니다. 이 4개의 32비트 그룹을 연결하면 128비트 해시 값이 생성됩니다.

md5 알고리즘에서는 모듈러스 512 다음에 바이트 길이가 448이 되도록 정보를 먼저 채워야 합니다. 따라서 정보의 바이트 길이(비트 길이)는 n*512 448, 즉 n*64 56바이트로 확장되며, n은 양의 정수입니다. 채우는 방법은 다음과 같습니다. 정보 뒤에 1과 수많은 0을 채우고, 위 조건이 충족될 때까지 정보를 0으로 채우는 것을 중지합니다. 그런 다음 이 결과에는 사전 패딩 정보 길이의 64비트 이진 표현이 추가됩니다. 이 두 단계의 처리 후 현재 정보 바이트 길이 =n*512 448 64=(n 1)*512, 즉 길이는 정확히 512의 정수 배수입니다. 그 이유는 후속 처리에서 정보 길이 요구 사항을 충족하기 때문입니다.

md5에는 체인 변수라고 하는 4개의 32비트 정수 매개변수가 있습니다: a=0x01234567, b=0x89abcdef, c=0xfedcba98, d=0x76543210.

이 4개의 링크 변수를 설정한 후 알고리즘의 4라운드 루프 작동이 시작됩니다. 주기 수는 메시지의 512비트 정보 패킷 수입니다.

위의 4개 링크 변수를 다른 4개 변수(a에서 a, b에서 b, c에서 c, d에서 d)에 복사합니다.

메인 루프에는 4개의 라운드가 있으며(md4에는 3개의 라운드만 있음) 각 루프는 매우 유사합니다. 첫 번째 라운드에는 16개의 작업이 있습니다. 각 연산은 a, b, c, d 중 세 개에 대해 비선형 함수 연산을 수행한 다음 그 결과를 네 번째 변수, 텍스트의 하위 그룹 및 상수에 추가합니다. 그런 다음 결과를 무한정 오른쪽으로 이동하고 a, b, c 또는 d 중 하나를 추가합니다. 마지막으로 a, b, c, d 중 하나를 이 결과로 바꿉니다.

다음은 각 작업에 사용되는 4개의 비선형 함수입니다(각 라운드마다 하나씩).

f(x,y,z) =(xamp;y)|((~x)amp;z)

g(x,y,z) =(xamp; z)|(yamp; (~z))

h(x, y, z) =x^y^z

i(x, y, z)=y^ (x|(~z))

(amp;는 AND, |는 OR, ~는 아님, ^는 XOR)

다음 네 가지 함수에 대한 설명: if x, y와 z의 해당 비트는 독립적이고 균일해야 합니다. 그러면 결과의 각 비트도 독립적이고 균일해야 합니다.

f는 비트 단위로 동작하는 함수이다. 즉, x이면 y이고, 그렇지 않으면 z입니다. 함수 h는 비트 패리티 연산자입니다.

mj가 메시지의 j번째 하위 그룹(0부터 15까지)을 나타낸다고 가정합니다. lt

ff(a, b, c, d, mj, s, ti)는 a=b((a (f(b,c,d) mj ti)lt;lt; gg(a,b,c,d,mj,s,ti)는 a=b((a (g)를 의미합니다. (b ,c,d) mj ti)lt;lt; hh(a,b,c,d,mj,s,ti)는 a=b((a (h(b,c,d) mj ti)lt를 의미합니다. ;lt ; ii(a, b, c, d, mj, s, ti)는 a=b ((a (i(b, c, d) mj ti)lt; lt;

4라운드(64단계)는 다음과 같습니다.

첫 번째 라운드

ff(a, b, c, d, m0, 7, 0xd76aa478)

ff(d , a, b, c, m1, 12, 0xe8c7b756)

ff(c, d, a, b, m2, 17, 0x242070db)

ff(b, c, d , a, m3, 22, 0xc1bdceee)

ff(a, b, c, d, m4, 7, 0xf57c0faf)

ff(d, a, b, c, m5 , 12, 0x4787c62a)

ff(c, d, a, b, m6, 17, 0xa8304613)

ff(b, c, d, a, m7, 22, 0xfd469501 )

ff(a, b, c, d, m8, 7, 0x698098d8)

ff(d, a, b, c, m9, 12, 0x8b44f7af)

ff(c, d, a, b, m10, 17, 0xffff5bb1)

ff(b, c, d, a, m11, 22, 0x895cd7be)

ff(a, b, c, d, m12, 7, 0x6b901122)

ff(d, a, b, c, m13, 12, 0xfd987193)

ff(c, d , a, b, m14, 17, 0xa679438e)

ff (b, c, d, a, m15, 22, 0x49b40821)

두 번째 라운드

gg(a, b, c, d, m1, 5, 0xf61e2562)

gg(d, a, b, c, m6, 9, 0xc040b340)

gg(c , d, a, b, m11, 14, 0x265e5a51)

gg(b, c, d, a, m0, 20, 0xe9b6c7aa)

gg(a, b, c , d, m5, 5, 0xd62f105d)

gg(d, a, b, c, m10, 9, 0x02441453)

gg(c, d, a, b, m15 , 14, 0xd8a1e681)

gg(b, c, d, a, m4, 20, 0xe7d3fbc8)

gg(a, b, c, d, m9, 5, 0x21e1cde6 )

gg(d, a, b, c, m14, 9, 0xc33707d6)

gg(c, d, a, b, m3, 14, 0xf4d50d87)

gg(b,c,d,a,m8,20,0x455a14ed

)

gg(a, b, c, d, m13, 5, 0xa9e3e905)

gg(d, a, b, c, m2, 9, 0xfcefa3f8)

gg(c, d, a, b, m7, 14, 0x676f02d9)

gg(b, c, d, a, m12, 20, 0x8d2a4c8a)

세 번째 라운드

hh(a, b, c, d, m5, 4, 0xfffa3942)

hh(d, a, b, c, m8, 11, 0x8771f681)

hh(c, d, a, b, m11, 16, 0x6d9d6122)

hh(b, c, d, a, m14, 23, 0xfde5380c)

hh(a, b, c, d, m1, 4, 0xa4beea44)

hh(d, a, b, c, m4, 11, 0x4bdecfa9)

hh( c, d, a, b, m7, 16, 0xf6bb4b60)

hh(b, c, d, a, m10, 23, 0xbebfbc70)

hh(a, b, c, d, m13, 4, 0x289b7ec6)

hh(d, a, b, c, m0, 11, 0xeaa127fa)

hh(c, d, a, b, m3, 16, 0xd4ef3085)

hh(b, c, d, a, m6, 23, 0x04881d05)

hh(a, b, c, d, m9, 4, 0xd9d4d039)

hh(d, a, b, c, m12, 11, 0xe6db99e5)

hh(c, d, a, b, m15, 16, 0x1fa27cf8)

p>

hh(b, c, d, a, m2, 23, 0xc4ac5665)

네 번째 라운드

ii(a, b, c, d, m0, 6 , 0xf4292244)

ii(d, a, b, c, m7, 10, 0x432aff97)

ii(c, d, a, b, m14, 15, 0xab9423a7)

ii(b, c, d, a, m5, 21, 0xfc93a039)

ii(a, b, c, d, m12, 6, 0x655b59c3)

ii(d, a, b, c, m3, 10, 0x8f0ccc92)

ii(c, d, a, b, m10, 15, 0xffeff47d)

ii ​​( b, c, d, a, m1, 21, 0x85845dd1)

ii(a, b, c, d, m8, 6, 0x6fa87e4f)

ii(d, a , b, c, m15, 10, 0xfe2ce6e0)

ii(c, d, a, b, m6, 15, 0xa3014314)

ii(b, c, d, a , m13, 21, 0x4e0811a1)

ii(a, b, c, d, m4, 6, 0xf7537e82)

ii(d, a, b, c, m11, 10 , 0xbd3af235)

ii(c, d, a, b, m2, 15, 0x2ad7d2bb)

>

ii(b, c, d, a, m9, 21, 0xeb86d391)

상수 ti는 다음과 같이 선택할 수 있습니다.

i단계에서 ti는 4294967296입니다. * abs(sin(i))의 정수부분, i의 단위는 라디안이다. (4294967296은 2의 32승과 같습니다.)

이 모든 작업이 완료되면 a, b, c, d에 각각 a, b, c, d를 추가하세요. 그런 다음 다음 데이터 그룹으로 알고리즘을 계속 실행하면 최종 출력은 a, b, c 및 d의 계단식입니다.

위에서 언급한 방법에 따라 md5 알고리즘을 구현한 후, 다음 정보를 이용하여 작성한 프로그램에 대해 간단한 테스트를 수행하여 프로그램에 오류가 있는지 확인할 수 있습니다.

md5 ("") = d41d8cd98f00b204e9800998ecf8427e

md5 ("a") = 0cc175b9c0f1b6a831c399e269772661

md5 ("abc") = 900150983c 24fb0d6963f7d28e17f72

md5 ("메시지 다이제스트") = f96b697d7cb7938d525a2f31aaf161d0

md5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b

md5 ("abcdefgh ijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789") =

d174ab98d277d9f5a5611c2c9f419d9f < /p >

md5 ("123456789012345678901234567890123456789012345678901234567890123456789

01234567890") = 57edf4a22be3c955ac49da2e2 10 7b67a

위의 정보를 사용하여 작성한 md5 알고리즘 예제를 테스트하는 경우 최종 결론은 다음과 같습니다. 표준적인 답변은 정확히 동일하므로 여기서 축하드립니다. 내 프로그램이 처음으로 성공적으로 컴파일되었을 때 위와 같은 결과가 나오지 않았습니다.

md5의 보안

md4에 비해 md5가 개선한 사항:

1. 네 번째 라운드를 추가했습니다.

2. 모든 단계;

3. 두 번째 라운드에서 함수 g의 대칭성을 약화시키기 위해 (xamp; y) | (yamp; z) | xamp ;z)|(yamp;(~z));

4. 첫 번째 단계에서는 이전 단계의 결과를 추가하므로 눈사태 효과가 더 빨라집니다. . 두 번째 및 세 번째 라운드에서 메시지 하위 그룹에 액세스하는 순서를 변경하여 더 유사하게 만들었습니다.

6. 더 빠른 눈사태 효과를 달성하기 위해 각 라운드의 원형 왼쪽 이동 변위를 대략적으로 최적화했습니다. 각 바퀴의 변위는 서로 다릅니다.

[color=red]간단히 말하면:

MD5는 메시지 다이제스트 알고리즘이라고 하며 모든 파일에 대해 고유한 MD5 확인 코드를 생성할 수 있는 비밀번호 알고리즘입니다. 각 파일의 지문은 모든 사람의 지문과 동일하므로 전송 과정에서 파일 내용이 손상되거나 수정되면 파일 MD5 확인을 통해 해당 파일의 내용이 변경됩니다. 파일이 완료되었습니다.

上篇: 러화 잠금화면에서 화조시집 비옌의 시계를 보는 데 요금이 부과되나요? 下篇: 회사에서 매일 업무 일기를 쓰도록 요구한 적이 있나요?
관련 내용