はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】噂のMD5が同じになる72文字で1文字しか変わらない文字列が本当か試してみる

はじめに

Xを見ていたら以下のような投稿を見かけました。


MD5とは可変長の入力に対して128ビットの固定長の値を出力するハッシュ関数です。

MD5(エムディーファイブ、英: message digest algorithm 5)は、暗号学的ハッシュ関数のひとつである。ハッシュ値は128ビット。

MD5、およびRIPEMDとよばれるハッシュ関数には理論的な弱点が存在することが明らかとなっている[3][4]。

2004年8月、暗号の国際会議 CRYPTO (のランプセッション)にて、MD5のコリジョンを求めることができたという報告があった。理論的可能性として、MD5を用いて改竄されないことを確認する場合、あらかじめ正規のファイルと不正なファイルを用意しておき、正規のファイルを登録しておきながら、実際には同じMD5を持つ不正なファイルに摩り替える攻撃がありえることを意味する。
...

MD5 - Wikipedia

MD5は衝突困難性という"同じハッシュ値になる任意の文字列X, Yを探せない"という性質が満たされないことが既に分かっています。その中でも、72文字の中で1文字しか変わらないもののハッシュ値が同じになる文字列が見つかったとのことらしいです。
https://journal.ntt.co.jp/backnumber2/1002/files/jn201002021.pdf


我ながら暇人を極めていると思いますが、お試しで調べてみようと思います。

実験

var md5 = MD5.Create();

// "A"と"E"の一文字だけが異なる文字列
var x = "TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak"u8.ToArray();
var y = "TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak"u8.ToArray();
     
// 16byteのハッシュ値(FA, AD, 49, 86, 6E, 94, 98, FC, 17, 19, F5, 28, 9E, 7A, 2, 69)
Console.WriteLine(string.Join(", ", md5.ComputeHash(x).Select(x => x.ToString("X"))));
Console.WriteLine(string.Join(", ", md5.ComputeHash(y).Select(x => x.ToString("X"))));

確かにどちらも16進数でFA, AD, 49, 86, 6E, 94, 98, FC, 17, 19, F5, 28, 9E, 7A, 2, 69になるっぽいです。