ROB BOWDEN:我是搶奪和 讓我們開裂。 所以請記住,從PSET規範 我們要需要使用 crypt函數。 對於該男子頁面,我們有兩個 哈希定義_xopensource。 不要擔心,為什麼 我們需要做的。 哈希包括unistd.h中。 所以一旦出的方式,讓 得到的實際方案。 我們需要做的第一件事是確保 用戶輸入一個有效的加密 在命令行中的密碼。 請記住,該方案應該 運行像點斜線裂縫, 然後加密的字符串。 所以,我們在這裡檢查,以確保 ARGC如果我們想 繼續與程序。 如果argc是不是兩個,這意味著 用戶沒有輸入加密 在命令行中的密碼,或者他們 進入不僅僅是加密 在命令行中的密碼,其中 情況下,我們不知道做什麼用的 命令行參數。 因此,如果ARGC是兩個,我們可以繼續進行。 而在這裡,我們要申報 一個可變的加密。 只是將原來的別名 argv1使整個 程序,我們不必叫它argv1, 然後你必須要考慮 關於這實際上意味著。 所以最後,我們想要驗證 的加密的密碼的用戶 進入實際上已經 加密的密碼。 每地穴的手冊頁, 加密後的密碼必須是13 字符長。 在這裡,注意到我們哈希定義 加密長度為13。 所以我們要做的僅僅是確保 字符串長度的加密 密碼是13。 而且,如果它不是,我們希望 退出程序。 所以一旦出的方式,我們可以 現在實際上是試圖找到什麼 加密後的密碼了 密碼。 在這裡,我們要搶鹽 從加密的密碼。 記住,每手冊頁 前兩個字符加密 字符串,喜歡這裡 - 50ZPJ等等 - 前兩個字符給 我們所使用的鹽 在隱窩功能。 而在這裡,我們看到,鹽公頃。 所以,我們要複製前兩個 字符,鹽長度哈希 定義為兩個。 我們要複製前兩個字符 到這個數組,鹽。 請注意,我們需要鹽長度加上 一,因為我們仍然需要一個空 終結者結束時,我們的鹽。 然後我們要宣布這個數組, 客人,尺寸最大長度加 1,最大長度為哈​​希定義 八,因為最大的密碼 是8個字符長。 我們要使用這個迭代 在所有可能的字符串,可以 有效的密碼。 因此,如果有效的密碼中的字符 只是一個,B,和c,然後 我們會遍歷A,B,C, AA,BA,CA,依此類推,直到 我們能看到CCCCCCCC - 8個C。 如果我們沒有向下有效 密碼,然後我們需要說 加密後的字符串是不 有效的開始。 所以,現在,我們達到這個而1環。 請注意,這意味著它的 一個無限循環。 注意有沒有break語句 裡面的這個無限循環。 只有return語句。 所以,我們從來沒有真正期望 退出循環。 我們只希望退出程序。 我已經添加print語句 這個循環的頂部剛剛打印出來 我們目前的猜測 密碼是什麼。 現在,這個循環做? 它遍歷所有可能的字符串 這可能是有效的密碼。 我們要做的第一件事是 我們目前的猜測是什麼 密碼是。 我們將採取的鹽,我們抓住 加密後的字符串,我們很 要加密的猜測。 這將給我們一個加密的猜測, 我們要比較 加密後的字符串,用戶 在命令行中輸入。 如果它們是相同的,在這種情況下, 字符串比較將返回0,如果 它們是相同的,那麼猜 生成的加密的密碼 字符串,在這種情況下,我們可以打印 作為我們的密碼和回報。 但是,如果他們不一樣的,那 意味著我們的猜測是不正確的。 我們想要遍歷 下一個有效的猜測。 所以,這就是這一段時間 循環正在嘗試做的。 這將重申我們的猜測 到下一個有效的猜測。 請注意,當我們說一個 我們的猜測有特定字符 達到的最大象​​徵,在這裡 哈希定義為一個波浪線,因為 這是最大的ASCII值字符 用戶可以輸入上面的 鍵盤,當字符到達 最大的象徵,那麼,我們要發送 它備份的最小的符號,這 是一個空間,又是最低的ASCII碼 價值符號讓用戶能夠 從鍵盤輸入。 因此,我們要集 的最小的符號。 然後,我們會去 到下一個字符。 那麼,如何是我們的猜測 要重複? 好吧,如果有效的字符是A,B, 和c,那麼我們就開始用, 它會遍歷到B,它會 遍歷到c。 c是我們最大的象徵,因此,我們將設置 C回,最低的象徵。 然後我們會遍歷索引 到下一個字符。 因此,如果最初的猜測是c時,下一個 字符將是空 終止符。 這裡,請注意,如果該字符 我們現在要 增量是空終止, 然後我們將它設置為 最小的象徵。 因此,如果猜測是C,那麼,我們的 新的猜測將是一個。 而且,如果我們原來的猜測 CCCC,那麼我們的新猜測 將是AAAAA。 因此,每當我們達到最大的字符串 給定長度,那麼我們 要實現的最小字符串 下一個的長度,這將 只是所有字符 最低的象徵。 現在,這個檢查在這裡幹什麼? 好吧,如果指數從第八 字符至9個字符 - 所以我們加8個C的 我們之前的猜測 - 那麼指數將會把重點放在 最後空終結我們的猜測 數組,它並不意味著實際上 用在我們的密碼。 因此,如果我們集中在這最後的空 終結者,那麼我們還沒有找到一個 有效使用的密碼,只是八 字符,表示不存在 有效的加密的密碼 給定的字符串。 我們必須要打印,稱 我們無法找到一個有效的 密碼,然後返回。 所以這個while循環迭代 在所有可能的字符串。 如果發現任何加密 預期加密的字符串,它會 返回該密碼。 它並沒有發現任何東西,然後 它將返回,印刷 是不是能找到什麼。 現在,請注意,在所有迭代 可能的字符串可能會 需要一段時間。 讓我們真正看到如何 長期需要。 讓我們破解。 嗯,哎呀呀 - 說未定義 參考地穴。 所以請記住,對於p設置規範, 地穴的man頁面,我們 需要鏈接隱窩。 現在,默認的命令 不知道你 要使用該功能。 因此,讓我們複製這個客戶端命令 只需添加到年底 連接地穴。 現在,它編譯。 因此,讓我們在一個給定的運行破解 加密後的字符串 - 所以撒的。 所以這是相當快的。 請注意,這13結束。 那麼,凱撒的加密密碼 恰好是13。 因此,讓我們嘗試其他密碼。 讓我們赫塞豪恩的加密 密碼和嘗試開裂,。 因此,我們注意到已經達到 三個字符。 我們遍歷所有可能 三個字符的字符串。 這意味著我們已經完成 遍歷所有可能的一個 兩個字符串。 現在,它看起來像這樣去 在我們到達之前,需要一段時間的 四個字符的字符串。 這可能需要一兩分鐘。 它沒有採取一兩分鐘。 我們四個字符的字符串。 但是現在,我們需要遍歷所有 可能四個字符的字符串,這 也許可能需要10分鐘。 然後,當我們到達5個字符 字符串,我們需要遍歷所有 的那些,這可能 採取了幾個小時。 我們需要遍歷所有可能的 六個字符的字符串,這 可能需要幾天等等。 因此,它可能需要很長的一個潛在的 遍歷所有可能 八字符和字符串較少。 因此,注意到,這不一定是 非常有效的算法尋找 輸入密碼。 你可能會認為 是更好的方法。 例如,密碼ZYX!32AB 可能不是一個很常見的密碼, 而密碼12345 可能很多較為常見。 所以試圖找到一個密碼的方法之一 更快速的只是看 是比較常見的密碼。 因此,例如,我們可以嘗試讀單詞 從一本字典,並嘗試所有 這些話作為我們的密碼猜測。 現在,也許一個密碼 是不是很簡單。 用戶也許有點聰明 並嘗試附加一個數字 一個字的結尾。 所以,也許他們的密碼為password1。 所以,你可以嘗試遍歷所有單詞 字典中的一個 追加到它的結束。 後話,說不定這樣做,你會 追加兩到它的結束。 或者,也許用戶甚至試圖 更聰明,他們希望自己的 密碼是“黑客”,但他們 要更換電子商務的所有實例 三分球。 所以,你可以做到這一點。 遍歷所有單詞在字典 但替換的字符 這些數字看起來像數字。 所以這種方式,你可能會趕上什至更多 密碼是很常見的。 但最終,只有這樣,你可以 捕獲所有密碼暴力破解 迫使遍歷所有 可能的字符串。 所以在最後,你需要遍歷 從一個字符的所有字符串 八個字符,這可能需要 很長一段時間,但你需要做到這一點。 我叫羅布鮑登。 這是破解。