要約

  • 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という四つのCファイルが載る。最後のドライバーは文字列、ファイル、標準入力を処理でき、-xを指定すると固定の試験を実行する。付録A.5は空文字列、a、abcから長い文字列まで七つの結果を印刷した。abcの答えは900150983cd24fb0d6963f7d28e17f72。自分の実装が違う値を返せば、読者は計算手順をさかのぼって調べられた。試験問題の後ろに模範解答が置いてある。

参考コードはPrivacy-Enhanced Mail向けの暗号ツールキットRSAREFから取られた。RFCに組み込むことで、文章を読む作業と実際に計算させる作業の距離が縮まった。別の実装を書いたチームは期待値と比べられ、移植したチームは自分たちの機械での結果を確かめられる。文書は実装の移植性に触れ、特定のリトルエンディアン環境に向けた最適化案まで示した。共有された規則は、読者の机の上で走らせて確かめるものになった。

当時の安全上の狙いも明記されている。MD5はMD4を発展させたものだった。1992年の説明では、MD4の採用が十分な批判的検討より速く進んだ可能性が述べられ、MD5は少し速度を譲って安全の余裕を増やそうとしていた。想定用途にはデジタル署名がある。大きなファイルを短い値にまとめ、秘密鍵による処理に使う。アルゴリズムは検討と将来の標準化に向けてパブリックドメインに置かれ、RFC自体はInformationalに分類された。そこには実行できる手順と、衝突を見つけにくいだろうという当時の見込みが並んでいた。

七つの試験は、前者を調べるのに役立つ。正しい値を出した実装は、その入力についてMD5の計算に合っている。攻撃者が意図的に同じ値になる別々のメッセージを作れるかは、暗号解析の仕事になる。巻末の答えをすべて正しく書ける生徒がいても、教科書の理論は後から改訂されることがある。計算結果の再現性と、その結果に託した安全性は別々に検証される。

2011年3月、RFC 6151が後者の評価を更新した。公開された攻撃を踏まえ、衝突耐性が必要な用途、特にデジタル署名にはMD5を使えないと明記した。HMAC-MD5や偶然の誤りを見つけるためのチェックサムなどは用途別に論じ、新しいプロトコル設計ではHMAC-MD5も避けるよう勧めた。abcを計算した値は1992年と同じままだった。その値に署名の信頼を載せる判断が変わったのである。

二つのRFCを並べると、技術文書の時間の流れが見える。1992年の文書は規則、参考コード、期待値を一冊にまとめ、独立したプログラム同士に共通の計算目標を与えた。2011年の文書は、研究が進んだ後の安全上の役割を更新した。MD5を正しく実装したプログラムは、後年も正しくMD5を計算する。署名の設計には別の選択が要る。模範解答は残り、試験の大問が差し替わった。