>> 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.