MD2 (Message Digest Algorithm 2) について
MD2は、
1989年に
ロナルド・リベストによって開発された
暗号学的
ハッシュ関数です。
8ビットコンピュータでの利用を想定して最適化されており、その仕様はRFC 1319で詳細に定義されています。
MD2の概要
MD2の主な特徴は、入力されたメッセージから固定長のハッシュ値を生成することです。このハッシュ値は、元のメッセージがわずかでも変更されると、大きく異なる値となるため、メッセージの改ざん検知などに利用されます。
MD2の処理は、まずメッセージを特定のブロックサイズ(12
8ビット/16バイト)の倍数になるようにパディングし、さらに16バイトのチェックサムを追加することから始まります。実際の計算では、48バイトの補助ブロックと、
円周率の小数部分から生成される256バイトのSテーブルが使われます。
計算の核となる部分は、入力された16バイトのデータに対して、補助ブロックの各バイトを18回並び替えるループです。この処理をパディングされたメッセージのすべてのブロックに対して実行し、最後に補助ブロックの最初の不完全なブロックがメッセージのハッシュ値として出力されます。
以下は、MD2で使われる256バイトのSテーブルを16進数で表したものです。
0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
MD2のハッシュ値の例
MD2のハッシュ値は12
8ビット(16バイト)で、通常は32桁の16進数で表現されます。
例として、以下のような入力と対応するMD2のハッシュ値を示します。
MD2("The quick brown fox jumps over the lazy dog") = 03d85a0d629d2c442e987525319fc471
MD2("The quick brown fox jumps over the lazy cog") = 6b890c9292668cdbbfda00a4ebf31f05
MD2("") = 8350e5a3e24c153df2275c9f80692773
これらの例からも分かるように、入力メッセージにわずかな変更を加えただけでも、ハッシュ値は大きく変化します。
MD2のセキュリティに関する問題点
MD2は、その脆弱性が指摘されており、現在では安全な
ハッシュ関数とは言えません。
1997年、MD2の圧縮関数においてコリジョン(ハッシュ値の衝突)が発見されました。
2004年には、MD2に対する原像攻撃(ハッシュ値から元のメッセージを推定する攻撃)が可能であることが示されました。
2008年には、より効率的な原像攻撃が発表され、2009年には衝突攻撃も発表されました。
これらのセキュリティ上の問題から、OpenSSL、GnuTLS、Network Security Servicesなどの主要なセキュリティライブラリでは、MD2の使用が非推奨とされ、セキュリティアップデートで無効化されています。
まとめ
MD2は、開発当初は有効なハッシュ関数でしたが、その後の研究でセキュリティ上の弱点が明らかになり、現在では安全な利用は推奨されません。より安全なハッシュ関数への移行が推奨されます。
参考文献
RFC 1319 - MD2 Message Digest Algorithm
RFC 6149 - MD2 to Historic Status
The compression function of MD2 is not collision free (Rogier, Chauvaud, 1995)
MD2 is not Secure without the Checksum Byte (Rogier, Chauvaud, 1997)
The MD2 Hash Function is Not One-Way (Muller, 2004)
Preimage and Collision Attacks on MD2 (Knudsen, Mathiassen, 2005)
関連項目
ハッシュ関数
MD4
MD5
Secure Hash Algorithm
外部リンク
Online MD2 Calculator over HTTPS
Serversniff.net: 文字列の MD2 などのハッシュ値を計算するオンラインツール
テキスト、16進、2進、Base64などの相互変換と同時にMD2その他のハッシュ値を計算するオンラインツール
1