1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB Bowden: Saya Rob, dan mari kita retak. 3 00:00:15,890 --> 00:00:19,390 Jadi ingat dari spec pset yang kami akan perlu menggunakan 4 00:00:19,390 --> 00:00:20,890 fungsi kubur. 5 00:00:20,890 --> 00:00:26,330 Untuk halaman lelaki itu, kita mempunyai dua hash menentukan _xopensource. 6 00:00:26,330 --> 00:00:28,290 Jangan bimbang tentang mengapa yang perlu kita lakukan itu. 7 00:00:28,290 --> 00:00:31,550 Dan juga termasuk unistd.h hash. 8 00:00:31,550 --> 00:00:35,920 >> Jadi sekali itu keluar dari jalan, mari kita mendapat program sebenar. 9 00:00:35,920 --> 00:00:39,570 Perkara pertama yang perlu kita lakukan ialah memastikan pengguna memasuki disulitkan sah 10 00:00:39,570 --> 00:00:41,520 password pada baris arahan. 11 00:00:41,520 --> 00:00:46,050 Ingat bahawa program ini sepatutnya akan berjalan seperti dot slash retak, dan 12 00:00:46,050 --> 00:00:48,120 kemudian rentetan disulitkan. 13 00:00:48,120 --> 00:00:52,990 >> Jadi di sini kita memeriksa untuk memastikan yang argc dua jika kita mahu 14 00:00:52,990 --> 00:00:54,380 meneruskan program ini. 15 00:00:54,380 --> 00:00:58,830 Jika argc bukan dua, yang bermakna sama ada pengguna tidak memasukkan disulitkan 16 00:00:58,830 --> 00:01:02,560 password pada baris arahan, atau mereka memasuki lebih daripada sekadar disulitkan 17 00:01:02,560 --> 00:01:05,379 password pada baris arahan, di mana kes kita tidak tahu apa yang perlu dilakukan dengan 18 00:01:05,379 --> 00:01:07,660 line hujah perintah. 19 00:01:07,660 --> 00:01:11,390 >> Jadi jika argc adalah dua, kita boleh terus. 20 00:01:11,390 --> 00:01:14,160 Dan di sini, kita akan mengisytiharkan yang disulitkan berubah-ubah. 21 00:01:14,160 --> 00:01:17,650 Itu hanya akan alias asal argv1 supaya seluruh ini 22 00:01:17,650 --> 00:01:20,690 program, kita tidak perlu memanggilnya argv1, yang kemudian anda perlu berfikir 23 00:01:20,690 --> 00:01:22,950 tentang apa yang benar-benar bermakna. 24 00:01:22,950 --> 00:01:27,180 >> Jadi akhirnya, kami mahu mengesahkan bahawa kata laluan disulitkan pengguna 25 00:01:27,180 --> 00:01:30,840 boleh memasuki sebenarnya telah kata laluan disulitkan. 26 00:01:30,840 --> 00:01:35,120 Setiap halaman lelaki itu daripada kubur itu, kata laluan disulitkan mesti 13 27 00:01:35,120 --> 00:01:36,440 huruf. 28 00:01:36,440 --> 00:01:41,500 Di sini, melihat bahawa kita hash ditakrifkan menyulitkan panjang sebagai 13. 29 00:01:41,500 --> 00:01:46,140 Jadi, kita hanya membuat memastikan bahawa panjang rentetan disulitkan 30 00:01:46,140 --> 00:01:49,090 kata laluan adalah 13. 31 00:01:49,090 --> 00:01:52,280 >> Dan jika ia tidak, kita mahu untuk keluar dari program ini. 32 00:01:52,280 --> 00:01:56,470 Jadi sekali itu keluar dari jalan, kita boleh sekarang sebenarnya cuba untuk mencari apa yang 33 00:01:56,470 --> 00:02:00,410 kata laluan yang memberikan disulitkan kata laluan itu. 34 00:02:00,410 --> 00:02:04,870 Di sini, kita mahu merebut garam daripada kata laluan disulitkan. 35 00:02:04,870 --> 00:02:08,930 Ingat, setiap halaman lelaki itu, bahawa dua watak pertama disulitkan 36 00:02:08,930 --> 00:02:10,590 string, seperti di sini - 37 00:02:10,590 --> 00:02:12,770 50ZPJ dan sebagainya - 38 00:02:12,770 --> 00:02:16,170 pertama dua watak memberi kami garam yang digunakan 39 00:02:16,170 --> 00:02:18,080 dalam fungsi kubur. 40 00:02:18,080 --> 00:02:21,740 >> Dan di sini, kita lihat bahawa garam adalah ha. 41 00:02:21,740 --> 00:02:27,610 Jadi kita mahu menyalin dua pertama watak-watak, panjang garam menjadi hash 42 00:02:27,610 --> 00:02:30,230 ditakrifkan sebagai dua. 43 00:02:30,230 --> 00:02:35,970 Kita perlu menyalin pertama dua watak ke dalam pelbagai ini, garam. 44 00:02:35,970 --> 00:02:39,340 Perhatikan bahawa kita perlu panjang garam ditambah satu, kerana kita masih perlu batal yang 45 00:02:39,340 --> 00:02:42,440 terminator pada akhir garam kami. 46 00:02:42,440 --> 00:02:46,940 >> Kemudian kita akan mengisytiharkan pelbagai ini, tetamu, saiz panjang max plus 47 00:02:46,940 --> 00:02:51,930 satu, di mana panjang max adalah hash ditakrifkan lapan, kerana kata laluan maksimum 48 00:02:51,930 --> 00:02:55,090 lapan aksara. 49 00:02:55,090 --> 00:02:59,860 Dan kita akan menggunakan ini untuk melelar atas semua tali yang mungkin boleh 50 00:02:59,860 --> 00:03:01,430 menjadi kata laluan yang sah. 51 00:03:01,430 --> 00:03:07,720 Jadi, jika watak-watak sah kata laluan hanya a, b, dan c, maka 52 00:03:07,720 --> 00:03:14,970 kita akan melelar atas a, b, c, aa, ba, ca, dan sebagainya, sehingga 53 00:03:14,970 --> 00:03:16,690 kita dapat melihat cccccccc - 54 00:03:16,690 --> 00:03:19,600 lapan c ini. 55 00:03:19,600 --> 00:03:23,620 >> Dan jika kita tidak mempunyai ke bawah yang sah kata laluan, maka kita perlu untuk mengatakan bahawa 56 00:03:23,620 --> 00:03:26,590 rentetan disulitkan tidak sah untuk memulakan. 57 00:03:26,590 --> 00:03:29,970 Jadi sekarang, kita mencapai ini manakala 1 gelung. 58 00:03:29,970 --> 00:03:33,100 Perhatikan bahawa bermakna ia gelung tak terhingga. 59 00:03:33,100 --> 00:03:36,430 >> Notis tiada pernyataan break dalam gelung ini tidak terbatas. 60 00:03:36,430 --> 00:03:38,570 Terdapat hanya kembali kenyataan. 61 00:03:38,570 --> 00:03:41,210 Oleh itu, kita sebenarnya tidak pernah mengharapkan untuk keluar dari gelung. 62 00:03:41,210 --> 00:03:44,750 Kita hanya mengharapkan untuk keluar dari program ini. 63 00:03:44,750 --> 00:03:48,220 Saya tambah kenyataan cetak ini kepada atas gelung ini hanya mencetak 64 00:03:48,220 --> 00:03:51,790 apa tekaan semasa kami di apa kata laluan itu. 65 00:03:51,790 --> 00:03:53,630 >> Kini, apa yang gelung ini lakukan? 66 00:03:53,630 --> 00:03:58,330 Ia gelung ke atas semua tali mungkin yang boleh menjadi kata laluan yang sah. 67 00:03:58,330 --> 00:04:02,700 Perkara pertama yang kita akan lakukan adalah mengambil tekaan semasa kami untuk apa 68 00:04:02,700 --> 00:04:03,920 kata laluan. 69 00:04:03,920 --> 00:04:07,230 Kami akan mengambil garam yang kita meraih daripada rentetan disulitkan, dan kami 70 00:04:07,230 --> 00:04:09,850 akan menyulitkan meneka. 71 00:04:09,850 --> 00:04:14,760 Ini akan memberikan kita rasa disulitkan, yang kita akan membandingkan terhadap 72 00:04:14,760 --> 00:04:18,810 rentetan disulitkan bahawa pengguna dimasukkan pada baris arahan. 73 00:04:18,810 --> 00:04:23,030 >> Jika mereka yang sama, di mana rentetan setanding akan kembali sifar, jika 74 00:04:23,030 --> 00:04:28,050 mereka yang sama, maka rasa adalah kata laluan yang dijana disulitkan 75 00:04:28,050 --> 00:04:33,520 tali, di mana kita boleh mencetak bahawa sebagai kata laluan dan kembali. 76 00:04:33,520 --> 00:04:37,520 Tetapi jika mereka tidak sama, yang bermakna tekaan kami adalah tidak betul. 77 00:04:37,520 --> 00:04:43,250 >> Dan kita mahu untuk melelar tekaan yang sah akan datang. 78 00:04:43,250 --> 00:04:46,410 Jadi itulah yang selama ini gelung cuba lakukan. 79 00:04:46,410 --> 00:04:51,760 Ia akan melelar tekaan kami untuk meneka yang sah akan datang. 80 00:04:51,760 --> 00:04:56,080 Perhatikan bahawa apabila kita mengatakan bahawa watak tertentu dalam tekaan kita mempunyai 81 00:04:56,080 --> 00:05:01,770 mencapai simbol max, yang di sini hash adalah ditakrifkan sebagai tilde, kerana 82 00:05:01,770 --> 00:05:05,710 itulah watak nilai ASCII terbesar yang pengguna boleh memasukkan di 83 00:05:05,710 --> 00:05:11,210 keyboard, apabila watak sampai ke max simbol, maka kita mahu menghantar 84 00:05:11,210 --> 00:05:17,150 ia kembali ke simbol minimum, yang ruang yang, sekali lagi ASCII yang paling rendah 85 00:05:17,150 --> 00:05:20,800 simbol nilai yang pengguna boleh masuk pada papan kekunci. 86 00:05:20,800 --> 00:05:22,940 >> Jadi kita akan menetapkan bahawa kepada simbol minimum. 87 00:05:22,940 --> 00:05:25,720 Dan kemudian kita akan pergi ke watak yang akan datang. 88 00:05:25,720 --> 00:05:28,730 Jadi bagaimana tekaan kami akan melelar? 89 00:05:28,730 --> 00:05:33,685 Nah, jika watak-watak yang sah ialah a, b, dan c, maka jika kita bermula dengan, 90 00:05:33,685 --> 00:05:36,630 ia akan melelar untuk b, ia akan melelar untuk c. 91 00:05:36,630 --> 00:05:44,360 c adalah simbol max kita, maka kita akan menetapkan c kembali ke, simbol minimum. 92 00:05:44,360 --> 00:05:48,100 Dan kemudian kita akan melelar indeks dengan watak yang akan datang. 93 00:05:48,100 --> 00:05:53,920 >> Jadi jika meneka asal c, seterusnya watak akan menjadi nol 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Down di sini, perhatian bahawa jika watak bahawa kita kini mahu 96 00:06:00,670 --> 00:06:04,690 kenaikan adalah null, maka kita akan menetapkan ke 97 00:06:04,690 --> 00:06:06,260 simbol minimum. 98 00:06:06,260 --> 00:06:11,431 Jadi jika meneka adalah c, maka kami tekaan baru akan menjadi aa. 99 00:06:11,431 --> 00:06:16,050 Dan jika rasa asal kami adalah CCCC, maka tekaan baru kami 100 00:06:16,050 --> 00:06:18,380 akan menjadi aaaaa. 101 00:06:18,380 --> 00:06:24,430 >> Jadi apabila kita mencapai tali maksimum panjang yang diberikan, maka kami 102 00:06:24,430 --> 00:06:29,090 akan melaksanakan untuk rentetan minimum panjang akan datang, yang akan 103 00:06:29,090 --> 00:06:34,420 hanya menjadi semua watak-watak simbol minimum. 104 00:06:34,420 --> 00:06:36,970 Kini, apa yang cek ini buat di sini? 105 00:06:36,970 --> 00:06:42,780 Nah, jika indeks berpindah dari kelapan watak watak sembilan - 106 00:06:42,780 --> 00:06:46,460 jadi kami menambah lapan c sebagai kami sebelum rasa - 107 00:06:46,460 --> 00:06:51,270 maka indeks akan memberi tumpuan kepada lepas null meneka kami 108 00:06:51,270 --> 00:06:57,990 pelbagai, yang tidak bermaksud untuk benar-benar digunakan dalam laluan kami. 109 00:06:57,990 --> 00:07:03,530 >> Jadi, jika kita memberi tumpuan kepada yang batal lepas terminator, maka kita tidak menemui 110 00:07:03,530 --> 00:07:07,750 kata laluan yang sah yang menggunakan hanya lapan watak-watak, yang bermaksud tidak ada 111 00:07:07,750 --> 00:07:10,550 kata laluan yang sah yang menyulitkan kepada rentetan yang diberikan. 112 00:07:10,550 --> 00:07:13,520 Dan kita perlu mencetak itu, berkata kami tidak dapat mencari yang sah 113 00:07:13,520 --> 00:07:16,100 kata laluan, dan kembali. 114 00:07:16,100 --> 00:07:20,280 Jadi gelung sementara ini akan melelar atas segala tali mungkin. 115 00:07:20,280 --> 00:07:24,640 >> Jika ia mendapati apa-apa yang menyulitkan kepada rentetan disulitkan dijangka, ia akan 116 00:07:24,640 --> 00:07:26,190 kembali kata laluan itu. 117 00:07:26,190 --> 00:07:29,610 Dan ia tidak mencari apa-apa, maka ia akan kembali, percetakan bahawa ia 118 00:07:29,610 --> 00:07:31,910 tidak dapat mencari apa-apa. 119 00:07:31,910 --> 00:07:39,220 Sekarang, melihat bahawa iterating ke atas semua tali mungkin mungkin akan 120 00:07:39,220 --> 00:07:40,420 mengambil sedikit masa. 121 00:07:40,420 --> 00:07:43,590 Mari kita benar-benar melihat bagaimana panjang yang mengambil masa. 122 00:07:43,590 --> 00:07:47,230 >> Mari kita membuat retak. 123 00:07:47,230 --> 00:07:51,050 Nah, oops - ia berkata undefined rujukan kepada kubur. 124 00:07:51,050 --> 00:07:55,330 Jadi ingat, untuk p menetapkan spesifikasi dan juga halaman lelaki untuk kubur kita 125 00:07:55,330 --> 00:07:58,130 perlu untuk menghubungkan dalam kubur. 126 00:07:58,130 --> 00:08:01,130 Sekarang, lalai membuat perintah tidak tahu bahawa anda 127 00:08:01,130 --> 00:08:03,010 mahu menggunakan fungsi itu. 128 00:08:03,010 --> 00:08:09,680 >> Jadi mari kita tulis arahan pelanggan ini dan hanya menambah kepada akhir 129 00:08:09,680 --> 00:08:13,300 itu, kubur menghubungkan. 130 00:08:13,300 --> 00:08:14,820 Kini, ia menyusun. 131 00:08:14,820 --> 00:08:23,880 Jadi mari berjalan keretakan yang diberikan rentetan disulitkan - 132 00:08:23,880 --> 00:08:25,130 maka beliau Caesar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Jadi yang agak cepat. 135 00:08:30,790 --> 00:08:33,230 >> Perhatikan bahawa ini berakhir pada 13. 136 00:08:33,230 --> 00:08:38,240 Nah, kata laluan disulitkan Caesar berlaku untuk menjadi 13. 137 00:08:38,240 --> 00:08:41,650 Jadi mari kita cuba kata laluan yang lain. 138 00:08:41,650 --> 00:08:45,830 Mari kita disulitkan Hirschhorn ini kata laluan dan cuba keretakan itu. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Jadi notis kita sudah mencapai tiga watak. 141 00:08:55,110 --> 00:08:58,660 Dan kami iterating atas semua mungkin rentetan tiga watak. 142 00:08:58,660 --> 00:09:01,420 Ini bermakna kita sudah selesai iterating atas semua salah satu mungkin dan 143 00:09:01,420 --> 00:09:04,660 dua tali watak. 144 00:09:04,660 --> 00:09:09,180 Sekarang, ia kelihatan seperti ini akan mengambil sedikit masa sebelum kita mencapai 145 00:09:09,180 --> 00:09:10,580 rentetan empat watak. 146 00:09:10,580 --> 00:09:14,680 Ia mungkin mengambil masa beberapa minit. 147 00:09:14,680 --> 00:09:16,055 >> Ia tidak mengambil masa beberapa minit. 148 00:09:16,055 --> 00:09:18,450 Kami di tali empat watak. 149 00:09:18,450 --> 00:09:22,800 Tetapi sekarang, kita perlu melelar atas segala mungkin rentetan empat-watak, yang 150 00:09:22,800 --> 00:09:26,000 yang mungkin mengambil mungkin 10 minit. 151 00:09:26,000 --> 00:09:28,720 Dan kemudian apabila kita mencapai lima watak tali, kita perlu melelar atas segala 152 00:09:28,720 --> 00:09:31,450 dari orang-orang, yang mungkin mengambil masa beberapa jam. 153 00:09:31,450 --> 00:09:34,080 Dan kita perlu melelar atas segala kemungkinan enam watak tali, yang 154 00:09:34,080 --> 00:09:36,560 mungkin mengambil masa beberapa hari dan sebagainya. 155 00:09:36,560 --> 00:09:41,380 >> Jadi ia boleh mengambil berpotensi sangat lama masa untuk melelar atas segala kemungkinan 156 00:09:41,380 --> 00:09:44,850 lapan-watak dan kurang tali. 157 00:09:44,850 --> 00:09:50,600 Jadi melihat bahawa ini tidak semestinya algoritma yang sangat berkesan untuk mencari 158 00:09:50,600 --> 00:09:51,860 kata laluan. 159 00:09:51,860 --> 00:09:54,540 Anda mungkin berfikir bahawa terdapat cara yang lebih baik. 160 00:09:54,540 --> 00:10:02,230 Sebagai contoh, ZYX password! 32ab mungkin tidak adalah kata laluan yang biasa, 161 00:10:02,230 --> 00:10:06,440 manakala kata laluan 12345 adalah mungkin banyak yang lebih biasa. 162 00:10:06,440 --> 00:10:13,570 >> Jadi salah satu cara untuk cuba untuk mencari kata laluan lebih cepat adalah untuk hanya melihat 163 00:10:13,570 --> 00:10:15,560 pada kata laluan yang lebih biasa. 164 00:10:15,560 --> 00:10:20,480 Sebagai contoh, kita boleh cuba untuk membaca perkataan daripada kamus dan cuba semua 165 00:10:20,480 --> 00:10:24,860 kata-kata sebagai tekaan kata laluan kami. 166 00:10:24,860 --> 00:10:29,210 Sekarang, mungkin kata laluan tidak begitu mudah. 167 00:10:29,210 --> 00:10:32,600 Mungkin pengguna itu adalah agak bijak dan cuba appending nombor kepada 168 00:10:32,600 --> 00:10:34,220 akhir perkataan. 169 00:10:34,220 --> 00:10:37,000 >> Jadi mungkin kata laluan mereka adalah password1. 170 00:10:37,000 --> 00:10:41,520 Jadi, anda boleh cuba iterating atas semua perkataan dalam kamus dengan satu 171 00:10:41,520 --> 00:10:43,210 dilampirkan ke akhir itu. 172 00:10:43,210 --> 00:10:47,360 Dan kemudian mungkin selepas berbuat demikian, anda akan menambah dua hingga akhir itu. 173 00:10:47,360 --> 00:10:50,240 >> Atau mungkin pengguna yang cuba untuk menjadi lebih lebih bijak, dan mereka mahu mereka 174 00:10:50,240 --> 00:10:54,980 kata laluan untuk menjadi "hacker," tetapi mereka akan menggantikan semua kejadian e ini 175 00:10:54,980 --> 00:10:56,600 dengan tiga. 176 00:10:56,600 --> 00:10:58,440 Jadi, anda boleh melakukan ini juga. 177 00:10:58,440 --> 00:11:02,100 Melelar atas semua perkataan di dalam kamus tetapi menggantikan watak-watak yang 178 00:11:02,100 --> 00:11:04,790 kelihatan seperti nombor dengan nombor-nombor. 179 00:11:04,790 --> 00:11:09,670 >> Jadi cara ini, anda boleh menangkap lebih kata laluan yang agak biasa. 180 00:11:09,670 --> 00:11:14,690 Tetapi pada akhirnya, satu-satunya cara anda boleh menangkap semua kata laluan adalah untuk kasar 181 00:11:14,690 --> 00:11:17,340 memaksa melelar atas segala tali mungkin. 182 00:11:17,340 --> 00:11:22,100 Jadi pada akhirnya, anda perlu melelar atas semua rentetan dari satu watak kepada 183 00:11:22,100 --> 00:11:28,110 lapan aksara, yang mungkin mengambil masa yang lama, tetapi anda perlu untuk melakukannya. 184 00:11:28,110 --> 00:11:30,024 >> Nama saya Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Dan ini adalah Crack. 186 00:11:31,425 --> 00:11:36,533