Apakah ada Titik Tetap MD5 di mana md5 (x) == x?

114

Apakah ada titik tetap dalam transformasi MD5, yaitu apakah ada x seperti itu md5(x) == x?

BoltClock
sumber
8
Transformasi md5 yang mana? Yang matematis (dari bitstring apa pun hingga 128 bit) atau yang dari bytestring apa pun ke hexstring 32-karakter (yang praktis)? Tidak jelas bahwa jawaban untuk keduanya sama ...
Rafał Dowgird
4
Yah, mereka adalah jawaban yang sama, kan? Kita tahu tidak terdapat x non-128-bit panjang yang md5(x) == x, karena md5(x) merupakan 128 bit panjang. Oleh karena itu, ada titik tetap di md5 untuk input berukuran sewenang-wenang jika dan hanya jika ada titik tetap di md5 pada domain 128-bit.
paul
1
Saya tidak berpikir mereka adalah jawaban yang sama karena untuk praktis 32 karakter hexstring itu adalah pilihan yang sewenang-wenang apakah Anda mewakili digit hex dalam huruf besar [AF] atau dalam huruf kecil [af]. Kedua representasi tersebut sesuai dengan angka 128-bit yang sama tetapi akan menghasilkan hash yang berbeda saat diberikan sebagai input ke MD5. Jadi probabilitas bahwa ada titik tetap di salah satu representasi sebenarnya1-(1/e)*(1/e) ≈ 86.47%
Dušan

Jawaban:

138

Karena jumlah MD5 adalah 128 bit, setiap titik tetap juga harus memiliki panjang 128 bit. Dengan asumsi bahwa MD5 sum dari setiap string seragam didistribusikan melalui semua jumlah mungkin, maka probabilitas bahwa setiap diberikan 128-bit string adalah titik tetap adalah 1 / 2 128 .

Dengan demikian, probabilitas bahwa tidak ada 128-bit string adalah titik tetap adalah (1 - 1 / 2 128 ) 2 128 , sehingga probabilitas bahwa ada titik tetap adalah 1 - (1 - 1 / 2 128 ) 2 128 .

Karena limit sebagai n menuju tak terhingga dari (1 - 1 / n ) n adalah 1 / e , dan 2 128 pasti merupakan angka yang sangat besar, probabilitas ini hampir persis 1 - 1 / e ≈ 63,21%.

Tentu saja, sebenarnya tidak ada keacakan - apakah ada titik tetap atau tidak. Tapi, kita bisa 63,21% yakin bahwa ada titik tetap. (Juga, perhatikan bahwa nomor ini tidak bergantung pada ukuran ruang kunci - jika jumlah MD5 adalah 32 bit atau 1024 bit, jawabannya akan sama, asalkan lebih besar dari sekitar 4 atau 5 bit).

Adam Rosenfield
sumber
11
Bisakah Anda benar-benar membuat asumsi bahwa jumlah MD5 dari string apa pun didistribusikan secara seragam ke semua kemungkinan jumlah?
Ori Pessach
13
Iya. Angka-angka besar dan modulous membentuk distribusi acak yang kasar. Jika tidak, Anda akan mengalami tabrakan yang konstan. Sifat md5 memaksa keluarannya untuk didistribusikan secara acak.
Stefan Kendall
2
Saya menggunakan jawaban Anda sebagai dasar untuk jawaban ini: security.stackexchange.com/questions/3851/…
CesarB
1
Ini, punya lencana emas.
Dennis
Kecuali md5 itu deterministik, tidak acak.
PyRulez
13

Upaya brute force saya menemukan 12 prefiks dan 12 sufiks cocok.

awalan 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762

akhiran 12: df12c1434cec7850a7900ce027af4b78 -> b2f6053087022898fe920ce027af4b78

Entri blog: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN

Thomas Egense
sumber
Tautan tidak berfungsi. Google plus ditutup pada bulan April
Ketik
Maaf ... Saya belum menyimpan entri blog dan cadangan google + tidak berfungsi untuk saya. Tapi inilah proyek github saya: github.com/thomasegense/MD5FixPointSearch
Thomas Egense
Apakah Anda yakin tentang ini: awalan 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762 Saya menggunakan md5sumperintah linux, saya mendapat hasil yang berbeda
ThunderPhoenix
Tidak yakin Anda menggunakan md5sum dengan benar. Anda juga dapat mengonfirmasi secara online di sini: onlinemd5.com
Thomas Egense
11

Karena hash tidak dapat diubah, ini akan sangat sulit untuk diketahui. Satu-satunya cara untuk menyelesaikan ini, adalah menghitung hash pada setiap kemungkinan keluaran hash, dan melihat apakah Anda menemukan kecocokan.

Untuk menguraikan, ada 16 byte dalam hash MD5. Artinya ada 2 ^ (16 * 8) = 3.4 * 10 ^ 38 kombinasi. Jika perlu 1 milidetik untuk menghitung hash pada nilai 16 byte, dibutuhkan 10790283070806014188970529154,99 tahun untuk menghitung semua hash tersebut.

Kibbee
sumber
2
Benar, jika Anda harus mencoba semuanya . Tetapi Anda hanya perlu mencoba setiap masukan yang mungkin untuk memverifikasi bahwa tidak ada titik tetap. Jika ada titik tetap (dan jawaban Adam Rosenfield menunjukkan bahwa mungkin ada) maka hanya satu tebakan yang dibutuhkan.
Naaff
Fungsi ini tidak dapat diubah dalam arti tidak memiliki invers matematis, namun ini hanya berarti bahwa untuk keluaran tertentu mungkin ada lebih dari satu masukan. Secara umum, ruang masukan untuk keluaran tertentu tidak terbatas, tetapi jika Anda tahu itu dimulai sebagai nilai 128-bit, Anda dapat mempersempit kemungkinannya. Ada kemungkinan untuk "bekerja mundur" jika Anda tidak memperlakukan fungsi sebagai kotak hitam, tetapi membaca spesifikasi dan menerapkan beberapa pemikiran matematis.
rndmcnlly
2
@ Naaff: "hanya perlu mencoba setiap masukan yang mungkin" - dan ini lebih mudah daripada mencoba setiap hash, bagaimana caranya? Justru sebaliknya, karena beberapa kemungkinan masukan mungkin di-hash ke keluaran yang sama.
Piskvor meninggalkan gedung
1
@Piskvor: Anda salah paham apa maksud Naaff (butuh waktu satu menit juga). Cara yang lebih jelas untuk mengatakannya adalah "Hanya jika tidak ada titik tetap, Anda akan mencoba setiap masukan yang mungkin (dari spasi 2 ^ 128)". Dengan kata lain, Anda hanya perlu mencoba setiap kemungkinan jika sebelumnya tidak ada yang berhasil. Jadi 1,08e28 tahun, atau satu tebakan beruntung!
P Daddy
"Jika butuh 1 milidetik untuk menghitung hash". GPU modern dapat menghitung miliaran hash per detik, jauh lebih cepat dari ini. Tapi tetap saja, itu akan memakan waktu yang sangat lama.
markasoftware
0

Meskipun saya tidak memiliki jawaban ya / tidak, tebakan saya adalah "ya" dan selanjutnya mungkin ada 2 ^ 32 titik tetap seperti itu (untuk interpretasi bit-string, bukan intepretasi karakter-string). Saya secara aktif mengerjakan ini karena sepertinya teka-teki yang mengagumkan dan ringkas yang akan membutuhkan banyak kreativitas (jika Anda tidak langsung puas dengan pencarian brute force).

Pendekatan saya adalah sebagai berikut: perlakukan itu sebagai masalah matematika. Kami memiliki 128 variabel boolean, dan 128 persamaan yang menggambarkan output dalam hal input (yang seharusnya cocok). Dengan memasukkan semua konstanta dari tabel dalam algoritme dan bit padding, harapan saya adalah persamaan tersebut dapat sangat disederhanakan untuk menghasilkan algoritme yang dioptimalkan untuk kasus input 128-bit. Persamaan yang disederhanakan ini kemudian dapat diprogram dalam beberapa bahasa yang bagus untuk pencarian yang efisien, atau diperlakukan secara abstrak lagi, menetapkan bit tunggal pada satu waktu, mengawasi kontradiksi. Anda hanya perlu melihat beberapa bit keluaran untuk mengetahui bahwa itu tidak cocok dengan masukan!

rndmcnlly
sumber
Ini benar-benar menarik, tolong bagikan kemajuan Anda saat Anda menempuh jalan ini?
user230910
-1

Mungkin, tetapi menemukannya akan memakan waktu lebih lama dari yang kita miliki atau akan melibatkan kompromi MD5.

Andru Luvisi
sumber
6
Itu belum rusak. Yang bisa mereka lakukan hanyalah, dalam jumlah waktu yang wajar menghasilkan 2 string yang menyamakan hash yang sama. Masih sangat sulit untuk menghasilkan string yang akan disamakan dengan hash tertentu.
Kibbee
9
tidak yakin bagaimana menemukan seseorang akan membahayakan md5, lebih dari itu akan membahayakan algoritme jika saya memberi tahu Anda MD5 ("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6
Kip
5
Titik tetap mungkin akan memberikan beberapa pengaruh pada matematika yang dapat menyebabkan pelanggaran MD5 yang lebih komprehensif. Saya tidak yakin bahwa Glomek benar-benar dapat membenarkan 'mungkin'; Saya akan menerima 'mungkin' tanpa keraguan.
Jonathan Leffler
-9

Ada dua interpretasi, dan jika seseorang diizinkan untuk memilih salah satunya, kemungkinan menemukan titik tetap meningkat menjadi 81,5%.

  • Interpretasi 1: Apakah MD5 dari keluaran MD5 dalam biner cocok dengan masukannya?
  • Interpretasi 2: apakah MD5 dari keluaran MD5 dalam hex sesuai dengan masukannya?
Joshua
sumber
13
Tidak ada tentang algoritma MD5 yang menyiratkan hex - ini beroperasi pada byte, dan menghasilkan byte - jadi saya pikir interpretasi terakhir tidak valid.
Nick Johnson
Ada atau tidaknya titik tetap di bawah interpretasi 1, mungkin masih ada (atau tidak) satu poin di bawah interpretasi 2. Namun, jika Anda tertarik untuk mengeksplorasi masalah, interpretasi 1 sepertinya tempat yang jauh lebih baik untuk memulai karena Anda menang Tidak harus membuat segala macam keputusan sewenang-wenang tentang casing dan pengkodean karakter. Selain itu, kasus biner memiliki lebih sedikit bit!
rndmcnlly
4
Anda salah mengartikan apa sebenarnya hex itu. Anda dapat merepresentasikan biner dalam hex, sama seperti Anda merepresentasikannya dalam desimal atau oktal atau basis 3. Ini adalah bilangan, dan memiliki representasi yang berbeda. Jadi, interpretasi 1 dan 2 adalah hal yang sama. Apa yang Anda pikirkan adalah representasi string karakter, yang sama sekali bukan hex yang sama tetapi merupakan nilai biner yang sama sekali berbeda. Sebenarnya Anda bisa memiliki banyak string hex berbeda dalam set karakter yang berbeda. Nilai hash 128-bit dapat direpresentasikan sebagai string "hex", tetapi tidak sama dengan string. String tersebut bukan data biner yang sama.
mendefinisikan
Dustin, interpretasi 2 benar-benar berarti MD5 dari string tampilan.
Joshua
4
Ada masalah besar dengan gagasan itu, karena itu secara langsung bergantung pada pengkodean karakter Anda. Skema pengkodean yang berbeda akan menghasilkan kumpulan hasil yang sama sekali berbeda. Bahkan ada keseluruhan proyek dan artikel yang membantahnya berdasarkan kesalahpahaman tentang bagaimana MD5 mengoperasikan acodingfool.typepad.com/blog/2009/05/the-kembler-identity.html
mendefinisikan
-23

Sebenarnya, karena input MD5 panjangnya 512 bit dan outputnya 128 bit, menurut saya itu tidak mungkin.

Ori Pessach
sumber
4
Tidak, MD5 string 1 byte ada.
Joshua
7
Input bisa dalam berbagai ukuran. Jika masukan kurang dari 512 byte maka itu empuk, tetapi masukan kecil masih dapat diterima. Dari Wikipedia: "MD5 memproses pesan dengan panjang variabel menjadi keluaran dengan panjang tetap 128 bit. Pesan masukan dipecah menjadi potongan blok 512-bit (enam belas bilangan bulat endian 32-bit); pesan diisi sehingga panjangnya habis dibagi 512. "
Naaff
Jadi, Anda mengasumsikan, katakanlah, 0000000001 = 1? Saya berpendapat bahwa pertanyaannya tidak ditentukan dengan baik, paling banter.
Ori Pessach
11
The masukan untuk MD5 dapat 128 bit. Jika MD5 ingin menambahkan masukan itu, maka, sejujurnya, itu urusan MD5. Masukan masih didefinisikan dengan baik. Demikian juga, outputnya adalah 128 bit yang terdefinisi dengan baik. Jika input (terdefinisi dengan baik) dan output (terdefinisi dengan baik) keduanya sama, maka MD5 (x) = x.
Naaff
2
@ Joshua MD5 dari string kosong (yaitu 0 byte) bahkan ada
Kip