要約

  • RFC 1319 は MD2 を、任意長のメッセージから 128 ビットの fingerprint または message digest を作るアルゴリズムとして記述する。
  • RFC はデジタル署名用途を意図し、衝突と指定済み digest に対応するメッセージを探す作業量について当時の見積りを示す一方、MD2 は新しく、追加の解析が必要だと述べる。
  • digest の一致は、名前の付いたアルゴリズムとバイト列に関する計算結果である。それ自体は署名、署名者、秘密鍵の保有、送達、受領、時刻、許可、結果ではない。

短い値は経緯を短くしなかった

固定長の digest は、長いメッセージを比較しやすくする。RFC 1319 では入力は任意長で、出力は 128 ビットである。これは選ばれたバイト列を毎回丸ごと運ばずに比較するための便利な表現であり、メッセージが誰により作られ、どの経路を通り、誰が受け取り、どう扱ったかを記録する形式ではない。

「このバイト列からこの値が出た」と言うだけでも、入力そのものまたは明確に記した表現、アルゴリズム名、計算した構成要素、値、時刻や文脈を残す必要がある。表示上同じ文章でも、文字コード、改行、転送デコード、コンテナからの抽出、正規化が異なれば入力は異なり得る。入力を失って値だけが残るなら、それは不在の列についての主張である。後から候補と比較できても、元の列やそこへ至る経緯を復元しない。

fingerprint という語は人の身元を連想させるが、RFC 1319 では message digest の比喩である。署名者、証明書、鍵の登録、送信者、受信者、ネットワーク接続を定義しない。語の親しみやすさが、アルゴリズムに存在しない主体を作ることはない。

MD2 はバイト列の変換を定めた

RFC は padding、checksum、48 バイトの内部バッファを経て最終 16 バイトを得る手順を記す。その細部は、digest が正確な入力と正確な手続に属することを示す。あるシステムが「同じファイル」と呼んでも、計算対象がアーカイブ全体か、取り出した payload か、デコード済み表現か、正規化済みテキストかを明示しなければ、異なる層を比較しているかもしれない。

RFC の例は test vector である。指定入力から指定された 16 進値を再現できれば、実装は計算について確認を得る。誰が例を書いたか、ネットワークを通ったか、誰が読んだか、誰が承認したかは証明しない。関数の再現性は受領証ではない。

期待された困難さは帰属ではなかった

RFC 1319 は、同じ digest を持つ二つのメッセージを見つけること、また事前指定された digest に合うメッセージを作ることを難しくする意図を記す。1992 年の見積りは前者がおよそ 2^64、後者がおよそ 2^128 操作であり、同時に MD2 は比較的新しく、さらに解析が必要だと注意する。

これは限定された計算上の問いへの答えである。誰がバイト列を供給したか、誰が値を公表したか、どの経路が運んだか、いつ誰が受け取ったか、受け手が承諾したかは答えない。正しく計算されたコピーでも出所は不明かもしれず、digest を載せたページも認証されていないかもしれない。候補メッセージは値が記録された後に作られた可能性もある。これらは 128 ビットに入らない。

衝突を難しくする性質と、身元を結び付ける性質は別の仕事である。後者には鍵、アカウント、台帳、証明書、信頼方針などの独立した結び付きが必要になる。MD2 の定義には秘密鍵操作がないので、誰かが秘密鍵を持つことを示せない。同意、不否認、実行権限も生まない。RFC の見積りを現行環境や特定実装についての永続的判定にすることもできない。

署名用途は別の記録を加えた

MD2 がデジタル署名用途向けであることは、MD2 が署名することではない。その用途では digest が別の署名方式への入力になり得る。その方式には署名アルゴリズム、秘密鍵、署名値、公開鍵、検証、鍵を主張された身元へ結び付ける方針が別々にある。

順序を残すことが重要である。まず特定のバイト列を選び MD2 を計算する。次に別の仕組みが署名する。次に検証者が公開鍵で検証する。その後に、台帳や証明書、信頼規則がその鍵をどの身元と結び付けるかを扱う。最後にアプリケーションが、検証結果で行為を許すか決める。転送と受領はなお別の出来事であり得る。

「hash が文書に署名した」は署名操作と署名者を消す。「digest が送信者を証明する」は鍵と身元の関係、そして転送記録を消す。「指紋が受領を示す」は受領者の観測を消す。計算が他層の結論を借りると、それぞれの検証可能な境界が失われる。

一致は限定された比較のままだった

送信元のコピーとアーカイブのコピーに同じ MD2 を適用して同値を得たなら、二つの入力について計算結果が一致したという有用な事実がある。しかしアーカイブがその送信元からコピーを得たとは証明しない。別の出所かもしれず、送信元のコピーが後から作られたかもしれず、その違いを示す記録が存在しないかもしれない。

ダウンロードのそばに掲げられた digest も、候補入力が得るべき値を知らせるだけである。掲示したページを自動で認証しない。公開者については別の信頼経路、署名、記録が扱う。digest は比較の値であり続ける。

検証可能な記録は、バイト列または明示した表現、アルゴリズム、値、計算者、時刻を保存する。署名があれば署名、パラメータ、検証、鍵または鍵参照、身元結合の根拠を別に保存する。さらに転送、受領、利用決定を保存する。相互に裏付けられても、一方を他方に置き換えてはならない。

RFC の沈黙は否定の証拠ではなかった

RFC 1319 は稼働中の実装、鍵の所有者、証明書方針、時刻サービス、転送経路、受領者を示さない。これはあらゆる環境にそれらがないという証明ではなく、アルゴリズム仕様がその事実の出典でないことを示す。

digest の不一致も同じように読むべきである。指定候補が指定計算で期待値を返さなかったことを示すだけで、悪意、ネットワーク故障、保存破損を直ちに示さない。入力は符号化、正規化、切断、再包装、誤ラベル化されているかもしれない。digest は比較失敗を知らせ、表現と経路の記録が原因を調べる。

RFC 1319 の力は狭い。定義されたバイト列の比較を実用にする。その力を、署名、身分証、配達証明、方針決定に同時にしようとすれば、精密さそのものを失う。

情報源と証拠の限界

本稿は RFC 1319 The MD2 Message-Digest Algorithm(1992 年 4 月)に基づく。同 RFC は任意長入力、128 ビット MD2 出力、衝突と指定ターゲットに関する当時の困難さの期待、署名用途、追加解析の注意を根拠づける。現行の暗号学的適合性、特定実装、署名、署名者の身元、鍵の保有、証明書状態、信頼時刻、出所、転送、保存、受領、許可、不否認、アプリケーション結果を根拠づけるものではない。