1 00:00:00,000 --> 00:00:13,000 2 00:00:13,000 --> 00:00:15,890 >> ROB Bowden: Tôi là Rob, và chúng ta hãy nứt. 3 00:00:15,890 --> 00:00:19,390 Vì vậy, nhớ từ các spec pset mà chúng ta sẽ được cần phải sử dụng 4 00:00:19,390 --> 00:00:20,890 hàm crypt. 5 00:00:20,890 --> 00:00:26,330 Đối với các trang con người, chúng ta có hai băm xác định _xopensource. 6 00:00:26,330 --> 00:00:28,290 Đừng lo lắng về lý do tại sao chúng ta cần phải làm điều đó. 7 00:00:28,290 --> 00:00:31,550 Và cũng băm bao gồm unistd.h. 8 00:00:31,550 --> 00:00:35,920 >> Vì vậy, một khi đó là ra khỏi con đường, chúng ta hãy đến được với các chương trình thực tế. 9 00:00:35,920 --> 00:00:39,570 Điều đầu tiên chúng ta cần phải làm là đảm bảo người dùng nhập vào một mật mã hợp lệ 10 00:00:39,570 --> 00:00:41,520 mật khẩu tại dòng lệnh. 11 00:00:41,520 --> 00:00:46,050 Nhớ rằng chương trình là vụ được chạy như dấu chấm dấu gạch chéo vết nứt, và 12 00:00:46,050 --> 00:00:48,120 sau đó mã hóa chuỗi. 13 00:00:48,120 --> 00:00:52,990 >> Vì vậy, ở đây chúng tôi đang kiểm tra để đảm bảo mà argc để hai nếu chúng ta muốn 14 00:00:52,990 --> 00:00:54,380 tiếp tục với chương trình. 15 00:00:54,380 --> 00:00:58,830 Nếu argc không phải là hai, có nghĩa là một trong hai người sử dụng không nhập một mật mã 16 00:00:58,830 --> 00:01:02,560 mật khẩu tại dòng lệnh, hoặc họ vào nhiều hơn chỉ là mã hóa 17 00:01:02,560 --> 00:01:05,379 mật khẩu tại dòng lệnh, trong đó trường hợp chúng tôi không biết phải làm gì với 18 00:01:05,379 --> 00:01:07,660 đối số dòng lệnh. 19 00:01:07,660 --> 00:01:11,390 >> Vì vậy, nếu argc là hai, chúng ta có thể tiếp tục. 20 00:01:11,390 --> 00:01:14,160 Và ở đây, chúng ta sẽ khai một biến được mã hóa. 21 00:01:14,160 --> 00:01:17,650 Đó là chỉ cần đi để bí danh ban đầu argv1 để suốt này 22 00:01:17,650 --> 00:01:20,690 chương trình, chúng tôi không cần phải gọi nó là argv1, mà sau đó bạn phải suy nghĩ 23 00:01:20,690 --> 00:01:22,950 về những gì thực sự có nghĩa là. 24 00:01:22,950 --> 00:01:27,180 >> Vì vậy, cuối cùng, chúng tôi muốn xác nhận rằng các mật khẩu mã hóa cho người sử dụng 25 00:01:27,180 --> 00:01:30,840 vào có thể đã thực sự được một mật khẩu mã hóa. 26 00:01:30,840 --> 00:01:35,120 Mỗi trang người đàn ông của hầm mộ, các mật khẩu mã hóa phải là 13 27 00:01:35,120 --> 00:01:36,440 ký tự. 28 00:01:36,440 --> 00:01:41,500 Lên đây, chúng tôi nhận thấy rằng băm xác định mã hóa chiều dài là 13. 29 00:01:41,500 --> 00:01:46,140 Vì vậy, chúng tôi chỉ đảm bảo rằng các chiều dài chuỗi của mã hóa 30 00:01:46,140 --> 00:01:49,090 mật khẩu là 13. 31 00:01:49,090 --> 00:01:52,280 >> Và nếu nó không phải, chúng tôi muốn để thoát khỏi chương trình. 32 00:01:52,280 --> 00:01:56,470 Vì vậy, một khi đó là ra khỏi con đường, chúng ta có thể bây giờ thực sự cố gắng để tìm thấy những gì 33 00:01:56,470 --> 00:02:00,410 mật khẩu cho các mật mã mật khẩu được. 34 00:02:00,410 --> 00:02:04,870 Ở đây, chúng tôi muốn lấy muối từ mật khẩu được mã hóa. 35 00:02:04,870 --> 00:02:08,930 Hãy nhớ rằng, mỗi trang người đàn ông, rằng hai ký tự đầu tiên của một mật mã 36 00:02:08,930 --> 00:02:10,590 chuỗi, giống như ở đây - 37 00:02:10,590 --> 00:02:12,770 50ZPJ và như vậy - 38 00:02:12,770 --> 00:02:16,170 hai nhân vật đầu tiên cho chúng ta muối đã được sử dụng 39 00:02:16,170 --> 00:02:18,080 trong các chức năng hầm mộ. 40 00:02:18,080 --> 00:02:21,740 >> Và ở đây, chúng ta thấy rằng muối là ha. 41 00:02:21,740 --> 00:02:27,610 Vì vậy, chúng tôi muốn sao chép lần đầu tiên hai ký tự, chiều dài muối được băm 42 00:02:27,610 --> 00:02:30,230 định nghĩa là hai. 43 00:02:30,230 --> 00:02:35,970 Chúng ta phải sao chép hai ký tự đầu tiên vào mảng này, muối. 44 00:02:35,970 --> 00:02:39,340 Chú ý rằng chúng ta cần chiều dài cộng với muối một, vì chúng ta vẫn cần một null 45 00:02:39,340 --> 00:02:42,440 thúc vào cuối muối của chúng tôi. 46 00:02:42,440 --> 00:02:46,940 >> Sau đó chúng ta sẽ khai báo mảng này, khách, chiều dài tối đa cộng với kích thước 47 00:02:46,940 --> 00:02:51,930 một trong những nơi chiều dài tối đa là băm xác định như tám, từ mật khẩu tối đa 48 00:02:51,930 --> 00:02:55,090 dài tám ký tự. 49 00:02:55,090 --> 00:02:59,860 Và chúng ta sẽ sử dụng điều này để lặp trên tất cả các chuỗi có thể là có thể 50 00:02:59,860 --> 00:03:01,430 có mật khẩu hợp lệ. 51 00:03:01,430 --> 00:03:07,720 Vì vậy, nếu các ký tự hợp lệ trong một mật khẩu chỉ là a, b, c, sau đó 52 00:03:07,720 --> 00:03:14,970 chúng tôi sẽ iterate qua a, b, c, aa, ba, ca, và như vậy, cho đến khi 53 00:03:14,970 --> 00:03:16,690 chúng ta có thể nhìn thấy cccccccc - 54 00:03:16,690 --> 00:03:19,600 tám của c. 55 00:03:19,600 --> 00:03:23,620 >> Và nếu chúng ta có không xuống một hợp lệ mật khẩu, sau đó chúng ta cần phải nói rằng 56 00:03:23,620 --> 00:03:26,590 chuỗi mã hóa là không hợp lệ để bắt đầu với. 57 00:03:26,590 --> 00:03:29,970 Vì vậy, bây giờ, chúng ta đạt được điều này trong khi 1 vòng. 58 00:03:29,970 --> 00:03:33,100 Nhận thấy rằng có nghĩa là nó một vòng lặp vô hạn. 59 00:03:33,100 --> 00:03:36,430 >> Chú ý không có lệnh break bên trong vòng lặp vô hạn này. 60 00:03:36,430 --> 00:03:38,570 Có được chỉ trở lại báo cáo. 61 00:03:38,570 --> 00:03:41,210 Vì vậy, chúng ta không bao giờ thực sự mong đợi để thoát khỏi vòng lặp. 62 00:03:41,210 --> 00:03:44,750 Chúng tôi chỉ hy vọng sẽ thoát khỏi chương trình. 63 00:03:44,750 --> 00:03:48,220 Tôi đã thêm lệnh in này đến đầu của vòng lặp này chỉ in ra 64 00:03:48,220 --> 00:03:51,790 những gì đoán hiện tại của chúng tôi tại mật khẩu là gì. 65 00:03:51,790 --> 00:03:53,630 >> Bây giờ, những gì được vòng này đang làm gì? 66 00:03:53,630 --> 00:03:58,330 Nó Looping trên tất cả các chuỗi có thể đó có thể là mật khẩu hợp lệ. 67 00:03:58,330 --> 00:04:02,700 Điều đầu tiên chúng ta sẽ làm là có đoán hiện tại của chúng tôi cho những gì 68 00:04:02,700 --> 00:04:03,920 mật khẩu. 69 00:04:03,920 --> 00:04:07,230 Chúng tôi sẽ lấy muối mà chúng ta nắm lấy từ chuỗi mã hóa, và chúng tôi 70 00:04:07,230 --> 00:04:09,850 sẽ mã hóa đoán. 71 00:04:09,850 --> 00:04:14,760 Điều này sẽ cho chúng ta một đoán mã hóa, mà chúng ta sẽ so sánh với 72 00:04:14,760 --> 00:04:18,810 chuỗi mã hóa mà người dùng nhập vào dòng lệnh. 73 00:04:18,810 --> 00:04:23,030 >> Nếu họ là như nhau, trong trường hợp này chuỗi so sánh sẽ trở về số không, nếu 74 00:04:23,030 --> 00:04:28,050 họ đang như nhau, sau đó đoán là mật khẩu đã tạo ra được mã hóa 75 00:04:28,050 --> 00:04:33,520 chuỗi, trong trường hợp này chúng ta có thể in mà như mật khẩu và lợi nhuận của chúng tôi. 76 00:04:33,520 --> 00:04:37,520 Nhưng nếu họ không giống nhau, mà có nghĩa là chúng tôi đoán không chính xác. 77 00:04:37,520 --> 00:04:43,250 >> Và chúng tôi muốn lặp lại để đoán hợp lệ tiếp theo. 78 00:04:43,250 --> 00:04:46,410 Vì vậy, đó là những gì khi điều này vòng lặp đang cố gắng làm. 79 00:04:46,410 --> 00:04:51,760 Nó sẽ lặp đoán của chúng tôi để đoán hợp lệ tiếp theo. 80 00:04:51,760 --> 00:04:56,080 Chú ý rằng khi chúng ta nói rằng một nhân vật đặc biệt trong chúng tôi đoán có 81 00:04:56,080 --> 00:05:01,770 đạt biểu tượng tối đa, mà lên đây được băm được xác định như một dấu ngã, vì 82 00:05:01,770 --> 00:05:05,710 đó là nhân vật giá trị ASCII lớn nhất người dùng có thể nhập vào 83 00:05:05,710 --> 00:05:11,210 bàn phím, khi nhân vật đạt đến tối đa biểu tượng, sau đó chúng tôi muốn gửi 84 00:05:11,210 --> 00:05:17,150 nó trở lại với biểu tượng tối thiểu, là một không gian, một lần nữa ASCII thấp nhất 85 00:05:17,150 --> 00:05:20,800 biểu tượng giá trị mà người dùng có thể nhập vào bàn phím. 86 00:05:20,800 --> 00:05:22,940 >> Vì vậy, chúng ta sẽ thiết lập mà để biểu tượng tối thiểu. 87 00:05:22,940 --> 00:05:25,720 Và sau đó chúng ta sẽ đi vào các ký tự tiếp theo. 88 00:05:25,720 --> 00:05:28,730 Vậy làm thế nào là dự đoán của chúng tôi sẽ lặp lại? 89 00:05:28,730 --> 00:05:33,685 Vâng, nếu các ký tự hợp lệ là a, b, và c, sau đó nếu chúng ta bắt đầu với một, 90 00:05:33,685 --> 00:05:36,630 nó sẽ lặp đi lặp lại để b, nó sẽ lặp c. 91 00:05:36,630 --> 00:05:44,360 c là biểu tượng tối đa của chúng tôi, vì vậy chúng tôi sẽ thiết lập c trở lại một, biểu tượng tối thiểu. 92 00:05:44,360 --> 00:05:48,100 Và sau đó chúng tôi sẽ lặp chỉ số để nhân vật tiếp theo. 93 00:05:48,100 --> 00:05:53,920 >> Vì vậy, nếu đoán ban đầu là c, tiếp theo nhân vật sẽ là vô giá trị 94 00:05:53,920 --> 00:05:55,560 terminator. 95 00:05:55,560 --> 00:06:00,670 Xuống đây, nhận thấy rằng nếu nhân vật mà bây giờ chúng tôi muốn 96 00:06:00,670 --> 00:06:04,690 tăng là kết thúc bởi null, sau đó chúng ta sẽ đặt nó vào 97 00:06:04,690 --> 00:06:06,260 biểu tượng tối thiểu. 98 00:06:06,260 --> 00:06:11,431 Vì vậy, nếu đoán là c, sau đó chúng tôi mới đoán là có được aa. 99 00:06:11,431 --> 00:06:16,050 Và nếu đoán ban đầu của chúng tôi là CCCC, sau đó đoán mới của chúng tôi 100 00:06:16,050 --> 00:06:18,380 là có được aa. 101 00:06:18,380 --> 00:06:24,430 >> Vì vậy, bất cứ khi nào chúng ta đạt được chuỗi tối đa có chiều dài nhất định, sau đó chúng tôi 102 00:06:24,430 --> 00:06:29,090 sẽ thực hiện vào chuỗi tối thiểu chiều dài tiếp theo, mà sẽ 103 00:06:29,090 --> 00:06:34,420 chỉ có tất cả các ký tự của biểu tượng tối thiểu. 104 00:06:34,420 --> 00:06:36,970 Bây giờ, những gì đang kiểm tra này làm gì ở đây? 105 00:06:36,970 --> 00:06:42,780 Vâng, nếu chỉ chuyển từ thứ tám nhân vật để nhân vật chín - 106 00:06:42,780 --> 00:06:46,460 vì vậy chúng tôi thêm tám c như trước đó của chúng tôi đoán - 107 00:06:46,460 --> 00:06:51,270 sau đó chỉ số này sẽ tập trung vào các cuối cùng kết thúc bởi null của đoán của chúng tôi 108 00:06:51,270 --> 00:06:57,990 mảng, mà không có nghĩa là để thực sự được sử dụng trong mật khẩu của chúng tôi. 109 00:06:57,990 --> 00:07:03,530 >> Vì vậy, nếu chúng ta tập trung vào null cuối cùng terminator, sau đó chúng tôi đã không tìm thấy một 110 00:07:03,530 --> 00:07:07,750 mật khẩu đó là giá trị sử dụng chỉ tám ký tự, có nghĩa là không có 111 00:07:07,750 --> 00:07:10,550 mật khẩu hợp lệ mã hóa để các chuỗi cung cấp. 112 00:07:10,550 --> 00:07:13,520 Và chúng ta phải in rằng, nói chúng tôi không thể tìm thấy một hợp lệ 113 00:07:13,520 --> 00:07:16,100 mật khẩu, và ngược lại. 114 00:07:16,100 --> 00:07:20,280 Vì vậy, trong khi vòng lặp này sẽ lặp lại trên tất cả các chuỗi có thể. 115 00:07:20,280 --> 00:07:24,640 >> Nếu nó tìm thấy bất kỳ mà mã hóa cho dự kiến ​​chuỗi mã hóa, nó sẽ 116 00:07:24,640 --> 00:07:26,190 trở lại mật khẩu. 117 00:07:26,190 --> 00:07:29,610 Và nó không tìm thấy bất cứ điều gì, sau đó nó sẽ trở lại, in ấn mà nó 118 00:07:29,610 --> 00:07:31,910 đã không thể tìm thấy bất cứ điều gì. 119 00:07:31,910 --> 00:07:39,220 Bây giờ, nhận thấy rằng duyệt qua tất cả chuỗi có thể có lẽ sẽ 120 00:07:39,220 --> 00:07:40,420 mất một lúc. 121 00:07:40,420 --> 00:07:43,590 Chúng ta hãy thực sự nhìn thấy như thế nào kéo dài gần. 122 00:07:43,590 --> 00:07:47,230 >> Chúng ta hãy làm cho vết nứt. 123 00:07:47,230 --> 00:07:51,050 Vâng, tiếc - nó nói không xác định tham khảo để crypt. 124 00:07:51,050 --> 00:07:55,330 Vì vậy, hãy nhớ rằng, cho p thiết lập thông số và cũng là người đàn ông trang cho hầm mộ mà chúng tôi 125 00:07:55,330 --> 00:07:58,130 cần phải liên kết trong hầm mộ. 126 00:07:58,130 --> 00:08:01,130 Bây giờ, mặc định thực hiện lệnh không biết rằng bạn 127 00:08:01,130 --> 00:08:03,010 muốn sử dụng chức năng đó. 128 00:08:03,010 --> 00:08:09,680 >> Vì vậy, hãy sao chép lệnh này khách hàng và chỉ cần thêm vào cuối cùng 129 00:08:09,680 --> 00:08:13,300 của nó, liên kết các hầm mộ. 130 00:08:13,300 --> 00:08:14,820 Bây giờ, nó biên dịch. 131 00:08:14,820 --> 00:08:23,880 Vì vậy, chúng ta hãy chạy crack trên được chuỗi mã hóa - 132 00:08:23,880 --> 00:08:25,130 để Caesar. 133 00:08:25,130 --> 00:08:28,690 134 00:08:28,690 --> 00:08:30,790 Vì vậy, đó là khá nhanh. 135 00:08:30,790 --> 00:08:33,230 >> Chú ý rằng điều này kết thúc vào ngày 13. 136 00:08:33,230 --> 00:08:38,240 Vâng, mật khẩu mã hóa của Caesar sẽ xảy ra là 13. 137 00:08:38,240 --> 00:08:41,650 Vì vậy, hãy thử mật khẩu khác. 138 00:08:41,650 --> 00:08:45,830 Chúng ta hãy mã hóa Hirschhorn của mật khẩu và thử nứt đó. 139 00:08:45,830 --> 00:08:51,750 140 00:08:51,750 --> 00:08:55,110 >> Vì vậy, lưu ý chúng tôi đã đạt ba nhân vật. 141 00:08:55,110 --> 00:08:58,660 Và chúng tôi đang lặp lại trên tất cả có thể chuỗi ba ký tự. 142 00:08:58,660 --> 00:09:01,420 Điều đó có nghĩa chúng ta đã kết thúc duyệt qua tất cả một thể và 143 00:09:01,420 --> 00:09:04,660 hai chuỗi ký tự. 144 00:09:04,660 --> 00:09:09,180 Bây giờ, có vẻ như điều này sẽ mất một thời gian trước khi chúng tôi đạt được 145 00:09:09,180 --> 00:09:10,580 chuỗi bốn ký tự. 146 00:09:10,580 --> 00:09:14,680 Nó có thể mất một vài phút. 147 00:09:14,680 --> 00:09:16,055 >> Nó đã không mất một vài phút. 148 00:09:16,055 --> 00:09:18,450 Chúng tôi đang ở trên chuỗi bốn ký tự. 149 00:09:18,450 --> 00:09:22,800 Nhưng bây giờ, chúng ta cần phải duyệt qua tất cả chuỗi bốn ký tự có thể, mà 150 00:09:22,800 --> 00:09:26,000 có thể có thể 10 phút. 151 00:09:26,000 --> 00:09:28,720 Và sau đó khi chúng tôi đạt được năm nhân vật chuỗi, chúng ta cần phải duyệt qua tất cả 152 00:09:28,720 --> 00:09:31,450 của những người, mà có thể mất một vài giờ. 153 00:09:31,450 --> 00:09:34,080 Và chúng ta cần phải duyệt qua tất cả có thể sáu ký tự chuỗi, mà 154 00:09:34,080 --> 00:09:36,560 có thể mất một vài ngày và như vậy. 155 00:09:36,560 --> 00:09:41,380 >> Vì vậy, nó có thể mất một tiềm năng rất lâu thời gian để duyệt qua tất cả có thể 156 00:09:41,380 --> 00:09:44,850 tám ký tự và chuỗi ít hơn. 157 00:09:44,850 --> 00:09:50,600 Vì vậy, nhận thấy rằng điều này là không nhất thiết phải là một thuật toán rất hiệu quả cho việc tìm kiếm 158 00:09:50,600 --> 00:09:51,860 một mật khẩu. 159 00:09:51,860 --> 00:09:54,540 Bạn có thể nghĩ rằng có những cách tốt hơn. 160 00:09:54,540 --> 00:10:02,230 Ví dụ, mật khẩu ZYX! 32ab có lẽ không phải là một mật khẩu rất phổ biến, 161 00:10:02,230 --> 00:10:06,440 trong khi đó mật khẩu là 12345 có thể rất phổ biến hơn. 162 00:10:06,440 --> 00:10:13,570 >> Vì vậy, một cách để cố gắng tìm một mật khẩu nhanh chóng hơn là chỉ cần nhìn 163 00:10:13,570 --> 00:10:15,560 tại các mật khẩu phổ biến hơn. 164 00:10:15,560 --> 00:10:20,480 Vì vậy, ví dụ, chúng ta có thể cố gắng đọc từ từ điển và thử tất cả 165 00:10:20,480 --> 00:10:24,860 những từ như đoán mật khẩu của chúng tôi. 166 00:10:24,860 --> 00:10:29,210 Bây giờ, có thể là một mật khẩu mà không phải là đơn giản. 167 00:10:29,210 --> 00:10:32,600 Có lẽ người dùng đã phần nào thông minh và cố gắng để phụ thêm một số 168 00:10:32,600 --> 00:10:34,220 kết thúc của một từ. 169 00:10:34,220 --> 00:10:37,000 >> Vì vậy, có lẽ mật khẩu của họ password1. 170 00:10:37,000 --> 00:10:41,520 Vì vậy, bạn có thể thử duyệt qua tất cả các từ trong từ điển với một 171 00:10:41,520 --> 00:10:43,210 gắn vào phần cuối của nó. 172 00:10:43,210 --> 00:10:47,360 Và sau đó có thể sau khi làm điều đó, bạn sẽ nối thêm một hai để kết thúc của nó. 173 00:10:47,360 --> 00:10:50,240 >> Hoặc có thể người dùng đang cố gắng để được thậm chí thông minh hơn, và họ muốn của họ 174 00:10:50,240 --> 00:10:54,980 mật khẩu là "hacker", nhưng chúng sẽ thay thế tất cả các trường hợp của điện tử của 175 00:10:54,980 --> 00:10:56,600 với thành ba. 176 00:10:56,600 --> 00:10:58,440 Vì vậy, bạn có thể làm điều này quá. 177 00:10:58,440 --> 00:11:02,100 Duyệt qua tất cả các từ trong từ điển nhưng thay thế ký tự 178 00:11:02,100 --> 00:11:04,790 nhìn như con số với những con số. 179 00:11:04,790 --> 00:11:09,670 >> Vì vậy, theo cách này, bạn có thể nắm bắt nhiều hơn mật khẩu là khá phổ biến. 180 00:11:09,670 --> 00:11:14,690 Nhưng cuối cùng, cách duy nhất bạn có thể nắm bắt tất cả các mật khẩu là vũ phu 181 00:11:14,690 --> 00:11:17,340 buộc lặp qua tất cả chuỗi có thể. 182 00:11:17,340 --> 00:11:22,100 Vì vậy, cuối cùng, bạn không cần phải lặp đi lặp lại trên tất cả các chuỗi từ một ký tự 183 00:11:22,100 --> 00:11:28,110 tám ký tự, mà có thể mất một thời gian rất dài, nhưng bạn cần phải làm điều đó. 184 00:11:28,110 --> 00:11:30,024 >> Tên tôi là Rob Bowden. 185 00:11:30,024 --> 00:11:31,425 Và đây là Crack. 186 00:11:31,425 --> 00:11:36,533