ROB Bowden: Saya Rob, dan mari kita retak. Jadi ingat dari spec yang pset kita akan perlu menggunakan fungsi crypt. Untuk halaman manual, kita memiliki dua hash mendefinisikan _xopensource. Jangan khawatir tentang mengapa kita perlu melakukan itu. Dan juga hash termasuk unistd.h. Jadi sekali itu keluar dari jalan, mari kita sampai ke program yang sebenarnya. Hal pertama yang perlu kita lakukan adalah memastikan pengguna memasuki dienkripsi valid password pada baris perintah. Ingat bahwa program ini seharusnya dijalankan seperti dot slash retak, dan kemudian dienkripsi tali. Jadi di sini kita memeriksa untuk memastikan bahwa argc dua jika kita ingin melanjutkan program. Jika argc tidak dua, artinya baik pengguna tidak memasukkan terenkripsi password pada baris perintah, atau mereka memasuki lebih dari sekadar dienkripsi password pada baris perintah, di mana kalau kita tidak tahu apa yang harus dilakukan dengan argumen baris perintah. Jadi jika argc dua, kita dapat melanjutkan. Dan di sini, kita akan mendeklarasikan variabel terenkripsi. Itu hanya akan alias asli argv1 sehingga seluruh ini Program, kita tidak harus menyebutnya argv1, yang kemudian Anda harus berpikir tentang apa yang benar-benar berarti. Jadi akhirnya, kami ingin memvalidasi bahwa password terenkripsi pengguna masuk bisa benar-benar telah password terenkripsi. Per halaman manual dari crypt, yang password terenkripsi harus 13 karakter. Sampai di sini, kita melihat bahwa hash didefinisikan mengenkripsi panjang sebagai 13. Jadi kita hanya memastikan bahwa panjang string terenkripsi password 13. Dan jika tidak, kami ingin untuk keluar dari program. Jadi sekali itu keluar dari jalan, kita bisa sekarang benar-benar mencoba untuk menemukan apa yang password yang memberikan terenkripsi sandi itu. Di sini, kami ingin mengambil garam dari password terenkripsi. Ingat, per halaman manual, yang dua karakter pertama dari terenkripsi String, seperti di sini - 50ZPJ dan sebagainya - dua karakter pertama memberikan kita garam yang digunakan dalam fungsi crypt. Dan di sini, kita melihat bahwa garam itu ha. Jadi kami ingin menyalin dua yang pertama karakter, panjang garam yang hash didefinisikan sebagai dua. Kami harus menyalin dua karakter pertama ke dalam array ini, garam. Perhatikan bahwa kita perlu panjang garam ditambah satu, karena kita masih perlu null terminator pada akhir garam kami. Kemudian kita akan mendeklarasikan array ini, tamu, ukuran panjang max plus satu, di mana panjang max hash didefinisikan delapan, karena password maksimum adalah delapan karakter. Dan kita akan menggunakan ini untuk iterate atas semua string kemungkinan yang bisa menjadi password yang valid. Jadi jika karakter yang valid untuk password hanya a, b, dan c, maka kami akan iterate atas a, b, c, aa, ba, ca, dan seterusnya, sampai kita bisa melihat cccccccc - delapan c itu. Dan jika kita belum menyusuri valid password, maka kita perlu mengatakan bahwa string terenkripsi tidak valid untuk memulai. Jadi sekarang, kita mencapai ini sementara 1 lingkaran. Perhatikan bahwa berarti itu infinite loop. Perhatikan tidak ada pernyataan break dalam lingkaran ini tak terbatas. Ada hanya kembali pernyataan. Jadi kita tidak pernah benar-benar berharap untuk keluar dari loop. Kami hanya berharap untuk keluar dari program. Saya telah menambahkan cetak ini pernyataan kepada atas lingkaran ini hanya mencetak apa tebakan kami saat ini di apa password. Sekarang, apa yang lingkaran ini lakukan? Ini perulangan atas semua string mungkin yang bisa menjadi password yang valid. Hal pertama yang akan kita lakukan adalah mengambil menebak kami saat ini untuk apa password. Kami akan mengambil garam yang kita meraih dari string terenkripsi, dan kami akan mengenkripsi menebak. Ini akan memberi kita menebak dienkripsi, yang akan kita membandingkan terhadap string terenkripsi bahwa pengguna dimasukkan pada baris perintah. Jika mereka adalah sama, dalam hal string yang sebanding akan kembali nol, jika mereka sama, kemudian menebak adalah password yang dihasilkan terenkripsi String, dalam hal ini kita dapat mencetak bahwa sebagai password dan kembali kami. Tapi jika mereka tidak sama, yang berarti dugaan kami salah. Dan kami ingin iterate ke menebak valid berikutnya. Jadi itulah yang saat ini loop coba lakukan. Ini akan iterate menebak kami untuk menebak valid berikutnya. Perhatikan bahwa ketika kita mengatakan bahwa karakter tertentu dalam menebak kami memiliki mencapai simbol max, yang di sini adalah hash didefinisikan sebagai tilde, karena itulah terbesar karakter ASCII nilai bahwa pengguna dapat masuk di Keyboard, ketika karakter mencapai max simbol, maka kita ingin mengirim itu kembali ke simbol minimum, yang adalah spasi, lagi ASCII terendah simbol nilai yang pengguna dapat masuk pada keyboard. Jadi kita akan mengatur bahwa ke simbol minimum. Dan kemudian kita akan pergi ke karakter berikutnya. Jadi bagaimana kita menebak akan iterate? Nah, jika karakter yang valid adalah a, b, dan c, maka jika kita mulai dengan, itu akan iterate ke b, itu akan iterate ke c. c adalah simbol maks kami, jadi kami akan menetapkan kembali ke c, simbol minimum. Dan kemudian kita akan iterate index ke karakter berikutnya. Jadi jika asal tebak adalah c, berikutnya Karakter akan menjadi nol terminator. Di sini, perhatikan bahwa jika karakter bahwa kita sekarang ingin kenaikan adalah null terminator, maka kita akan mengaturnya ke simbol minimum. Jadi jika tebakan itu c, maka kami Dugaan baru akan menjadi aa. Dan jika menebak kami asli cccc, kemudian menebak baru kami akan menjadi aaaaa. Jadi setiap kali kita mencapai string maksimum dengan panjang tertentu, maka kita akan mengimplementasikan ke string minimum dari panjang berikutnya, yang akan hanya menjadi semua karakter simbol minimum. Sekarang, apa yang cek ini lakukan di sini? Nah, jika indeks bergerak dari kedelapan karakter ke sembilan karakter - jadi kita tambahkan delapan c sebagai sebelumnya kami kira - maka indeks akan fokus pada terakhir nol terminator menebak kami array, yang tidak dimaksudkan untuk benar-benar digunakan dalam password kita. Jadi jika kita terfokus pada nol lalu terminator, maka kita belum menemukan sandi yang valid menggunakan hanya delapan karakter, yang berarti tidak ada password yang valid yang mengenkripsi dengan string yang diberikan. Dan kami harus mencetak itu, mengatakan kita tidak bisa menemukan valid password, dan kembali. Jadi sementara ini loop akan iterate atas semua string mungkin. Jika menemukan yang mengenkripsi ke diharapkan string terenkripsi, itu akan kembali sandi itu. Dan itu tidak menemukan apa-apa, maka itu akan kembali, mencetak bahwa tidak dapat menemukan apa-apa. Sekarang, perhatikan bahwa iterasi atas semua mungkin string mungkin akan memakan waktu cukup lama. Mari kita benar-benar melihat bagaimana panjang yang membutuhkan. Mari kita membuat retak. Nah, oops - itu mengatakan tidak terdefinisi referensi untuk crypt. Jadi ingat, untuk p set spec dan juga halaman manual untuk crypt yang kita perlu link di crypt. Sekarang, default perintah make tidak tahu bahwa Anda ingin menggunakan fungsi tersebut. Jadi mari kita salin ini perintah klien dan hanya menambahkan ke akhir itu, menghubungkan crypt. Sekarang, mengkompilasi. Jadi mari kita jalankan retak diberikan terenkripsi String - sehingga Caesar. Jadi itu cukup cepat. Perhatikan bahwa ini berakhir pada tanggal 13. Nah, password terenkripsi Caesar terjadi menjadi 13. Jadi mari kita coba sandi lain. Mari kita Hirschhorn yang dienkripsi kata sandi dan mencoba retak itu. Jadi perhatikan kita sudah mencapai tiga karakter. Dan kita iterasi semua kemungkinan tiga karakter string. Itu berarti kita sudah selesai iterasi atas semua kemungkinan satu dan dua string karakter. Sekarang, sepertinya ini akan diperlukan beberapa saat sebelum kita mencapai empat karakter string. Mungkin butuh beberapa menit. Tidak butuh waktu beberapa menit. Kita berada di string empat karakter. Tapi sekarang, kita perlu untuk iterate atas semua mungkin string empat karakter, yang yang mungkin mengambil mungkin 10 menit. Dan kemudian ketika kita mencapai lima karakter string, kita perlu untuk iterate atas semua dari mereka, yang mungkin mengambil beberapa jam. Dan kita perlu untuk iterate atas semua mungkin enam-string karakter, yang mungkin butuh beberapa hari dan seterusnya. Jadi bisa mengambil berpotensi sangat panjang waktu untuk iterate atas semua mungkin delapan karakter dan sedikit string. Jadi melihat bahwa ini tidak selalu algoritma yang sangat efisien untuk menemukan password. Anda mungkin berpikir bahwa ada cara yang lebih baik. Misalnya, password ZYX! 32ab mungkin bukan password yang sangat umum, sedangkan password adalah 12345 mungkin banyak yang lebih umum. Jadi salah satu cara untuk mencoba untuk menemukan password lebih cepat adalah untuk hanya melihat pada password yang lebih umum. Jadi misalnya, kita dapat mencoba untuk membaca kata-kata dari kamus dan mencoba semua kata-kata sebagai menebak password kita. Sekarang, mungkin password tidak sesederhana itu. Mungkin pengguna agak pintar dan mencoba menambahkan nomor ke akhir kata. Jadi mungkin password mereka adalah password1. Jadi Anda dapat mencoba iterasi semua kata dalam kamus dengan satu ditambahkan ke akhir itu. Dan kemudian mungkin setelah melakukan itu, Anda akan tambahkan dua sampai akhir itu. Atau mungkin pengguna mencoba untuk menjadi lebih lebih pintar, dan mereka ingin mereka password untuk menjadi "hacker," tapi mereka akan menggantikan semua contoh e yang dengan tiga. Jadi Anda bisa melakukannya juga. Iterate atas semua kata dalam kamus tapi ganti karakter yang terlihat seperti angka dengan angka-angka. Jadi cara ini, Anda mungkin menangkap lebih password yang cukup umum. Tetapi pada akhirnya, satu-satunya cara Anda bisa menangkap semua password adalah untuk brute memaksa iterate atas semua mungkin string. Jadi pada akhirnya, Anda perlu iterate atas semua string dari satu karakter ke delapan karakter, yang mungkin mengambil waktu yang sangat lama, tetapi Anda harus melakukannya. Nama saya Rob Bowden. Dan ini adalah Crack.