はじめに
Xを見ていたら以下のような投稿を見かけました。
Here is a 72-byte alphanum MD5 collision with 1-byte difference for fun:
— Marc Stevens (@realhashbreaker) 2024年3月19日
md5("TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
=
md5("TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
MD5とは可変長の入力に対して128ビットの固定長の値を出力するハッシュ関数です。
MD5(エムディーファイブ、英: message digest algorithm 5)は、暗号学的ハッシュ関数のひとつである。ハッシュ値は128ビット。
MD5、およびRIPEMDとよばれるハッシュ関数には理論的な弱点が存在することが明らかとなっている[3][4]。
2004年8月、暗号の国際会議 CRYPTO (のランプセッション)にて、MD5のコリジョンを求めることができたという報告があった。理論的可能性として、MD5を用いて改竄されないことを確認する場合、あらかじめ正規のファイルと不正なファイルを用意しておき、正規のファイルを登録しておきながら、実際には同じMD5を持つ不正なファイルに摩り替える攻撃がありえることを意味する。
...
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
になるっぽいです。