요약

  • 1992년 4월의 RFC 1321은 MD5 계산 규칙과 C 참고 구현, 시험 구동기, 예상 출력 일곱 개를 한 문서에 실었다. 구현자는 실행 중인 프로그램의 값을 공통 기준에 맞춰 확인할 수 있었다.
  • 2011년의 RFC 6151은 충돌 저항성이 필요한 디지털 서명 등의 용도에서 MD5를 쓰기 어렵다고 평가를 고쳤다. 옛 시험값은 여전히 MD5 계산 자체를 확인하는 기준으로 남았다.

종이 위 규칙을 내 컴퓨터에서 확인하기

MD5 요약값은 화면에서 알파벳과 숫자가 뒤섞인 한 줄로 보인다. RFC 1321은 그 한 줄이 만들어지는 과정을 꼼꼼히 적었다. 입력 끝에 비트를 붙여 정해진 길이를 맞추고 원래 메시지의 길이를 덧붙인 뒤, 네 개의 32비트 단어를 시작 상태로 삼아 512비트 블록을 처리한다. 바이트 순서나 채움 비트 하나만 달라도 같은 입력에 다른 값이 나온다. 여러 사람이 같은 계산을 하려면 사소해 보이는 단계까지 맞춰야 했다.

Rivest는 확인 도구도 함께 건넸다. 부록 A에는 global.h, md5.h, md5c.c, mddriver.c가 들어 있다. 마지막 파일은 문자열과 파일, 표준 입력을 시험하고 -x 옵션으로 고정된 시험 묶음을 실행한다. 부록 A.5에는 빈 문자열, a, abc부터 긴 글자와 숫자열까지 일곱 출력이 적혀 있다. abc의 예상값은 900150983cd24fb0d6963f7d28e17f72다. 독자에게 숙제를 내면서 해답을 책 뒤에 붙여 둔 셈이다. 다른 값이 나오면 구현자는 채움과 바이트 배열부터 다시 살펴볼 수 있다.

참고 코드는 Privacy-Enhanced Mail을 위한 암호 도구 모음 RSAREF에서 왔다. RFC 안에 그 코드를 넣자 글로 쓴 규칙과 실행 가능한 사례 사이의 거리가 가까워졌다. 독자적인 구현을 만드는 팀은 출력값을 비교하고, 코드를 다른 기계로 옮기는 팀은 새 환경에서 같은 답이 나오는지 확인할 수 있었다. 문서는 이 구현의 이식성을 언급하고 특정 리틀엔디언 기계를 위한 최적화 방안도 제시했다. 공동의 규칙을 각자 책상 위에서 직접 확인하게 한 구성이다.

그 문서에는 당시의 보안 기대도 분명히 있다. MD5는 MD4를 발전시킨 알고리즘이었다. RFC는 MD4의 채택이 충분한 비판적 검토보다 빠르게 진행됐을 가능성을 적고, MD5가 속도를 조금 양보해 더 큰 안전 여유를 얻도록 설계했다고 설명한다. 예상 용도에는 디지털 서명이 있었다. 큰 파일을 작은 요약값으로 줄인 뒤 개인키 연산에 쓰는 방식이다. 알고리즘은 검토와 향후 표준화 가능성을 위해 공개됐고, RFC 자체의 분류는 Informational이었다. 계산법과 충돌을 찾기 어렵다는 당시의 기대가 같은 문서에 실렸다.

일곱 시험 출력은 계산을 점검한다. 공개된 입력에 대해 내 프로그램이 정해진 MD5 값을 내는지 금방 알 수 있다. 공격자가 의도적으로 같은 요약값을 가진 서로 다른 메시지를 만들어 낼 수 있는지는 암호 분석이 답할 문제다. 책 뒤의 풀이를 전부 맞힌 학생도 그 책의 안전 이론이 나중에 고쳐지는 일을 겪을 수 있다. 재현 가능한 산술과 적에게 견디는 성질에는 서로 다른 증거가 필요하다.

2011년 3월 RFC 6151이 그 평가를 새로 썼다. 공개된 공격 연구를 바탕으로 충돌 저항성이 필요한 곳, 특히 디지털 서명에는 MD5가 적합하지 않다고 했다. HMAC-MD5와 우발적인 오류를 찾기 위한 체크섬은 따로 다루면서 새 프로토콜에는 HMAC-MD5를 쓰지 말라고 권했다. abc를 입력한 프로그램은 여전히 1992년의 답을 출력한다. 달라진 것은 그 답에 디지털 서명의 신뢰를 실어도 되는지에 대한 판단이다.

두 RFC를 이어 읽으면 기술 문서의 두 시간이 보인다. 1992년에는 설명, 참고 코드, 예상 결과가 한 묶음으로 독립 구현자들에게 공동의 계산 목표를 줬다. 2011년에는 연구가 축적된 뒤 그 계산이 맡을 보안상의 역할을 다시 정했다. MD5를 정확히 계산하는 프로그램은 그대로 정확하다. 서명을 설계하는 사람은 다른 선택을 해야 했다. 정답지는 책 뒤에 그대로 있었고 시험의 큰 문제가 바뀌었다.