ROB BOWDEN:私はロブだし、 クラッキングましょう。 だからPSETスペックから覚えている 私たちは、使用する必要があることになるだろう 暗号化機能。 manページでは、我々は2つ​​を持っている ハッシュ_xopensource定義。 なぜ心配しないでください 我々はそれを行う必要があります。 また、ハッシュunistd.hが含まれています。 だから一度方法のうちだ、してみましょう 実際のプログラムを取得する。 私たちが行う必要がある最初の事は確認している ユーザは、有効な暗号化に入った コマンドラインでパスワードを入力します。 プログラムが想定されていることを忘れないでください ドットスラッシュ亀裂のように実行される、と その後、暗号化された文字列。 そこでここでは、確認するためにチェックしている その2へのargc我々はしたい場合 プログラムを続行。 のargcが2でない場合、それはどちらかを意味します ユーザーが暗号化されたが入力されていません コマンドラインでパスワード、またはそれら 単に暗号化された以上のものを入力 でコマンドラインでパスワード、 我々が何をすべきか分からない場合 コマンドライン引数。 argcは、2つあった場合そこで、我々は継続することができます。 そしてここで、我々は宣言するつもりだ 暗号化された変数。 それはちょうどエイリアスにオリジナルを起こっている この全体argv1よう プログラムは、我々はそれargv1呼び出す必要はありません その次にあなたが考えなければならない それが実際に何を意味するのかについて。 だから最終的に、我々はそれを検証したい 暗号化されたパスワードユーザー 入力した実際にあったかもしれない 暗号化されたパスワード。 陰窩のmanページあたりの、 暗号化されたパスワードは13でなければなりません 長い文字。 ここまで、我々はハッシュ定義されていることがわかり 13として長さを暗号化します。 だから我々は単にことを確認しています 暗号化された文字列の長さ パスワードは13です。 そうでないならば、我々はしたい プログラムを終了します。 だから一度方法のうちだ、我々はできる 今、実際に何を探してみる 暗号化されたを与えたパスワード パスワードがあった。 ここでは、塩をつかむしたい 暗号化されたパスワードから。 、manページあたりの、覚えている 暗号化されたの最初の2文字 ここのような文字列、 - 50ZPJのように - 最初の2文字は与える 私たちを使用した塩 暗号化機能である。 そしてここで、我々は塩がヘクタールだったことがわかります。 だから私たちは、最初の2つをコピーしたい 文字、ハッシュされて塩の長さ 2として定義されます。 我々は最初の2文字をコピーする必要が この配列に、塩。 我々はプラス塩の長さが必要なことに注意してください 我々はまだ、nullを必要とするので1、 我々の塩の終わりにターミネータ。 次に我々は、この配列を宣言するつもりだ サイズ最大長のゲスト、プラス 最大長が定義されたハッシュである1、 8のように、最大​​のパスワードから 8文字の長さ。 そして我々は反復するためにこれを使用するつもりだ 可能性のあるすべての文字列の上に 有効なパスワードである。 もしそうであれば、パスワードに有効な文字 その後、ちょうど、a、b、およびcであった 我々は、A、B、C、を反復でしょう AA、BA、CA、というように、時まで 我々はCCCCCCCC見ることを得る - 8 Cの。 そして、我々は有効なダウン持っていなければ 、その後、我々はそれを言うためにパスワードを必要とする 暗号化された文字列ではありませんでした で始まるのは有効。 だから今、私たちは1ループしながら、これを達する。 それが意味することに注意してください 無限ループ。 ないbreak文が存在しないに注意してください この無限ループの内側。 文だけを返しています。 だから私たちは、実際には期待することはありません ループを終了します。 我々は唯一のプログラムを終了することを期待しています。 私は、このprint文を追加しました ただプリントアウトするために、このループの先頭 何を私たちの現在の推測で 何のパスワードです。 さて、このループは何をやっている? これは、すべての可能性のある文字列をループだ それは有効なパスワードである可能性があります。 私たちがやろうとしている最初の事はある 何のために私たちの現在の推測を取る パスワードです。 我々はからつかんでいる塩を取るよ 暗号化された文字列、そして我々はしている 推測を暗号化するつもり。 これは、私たちに暗号化された推測を与える 我々はと比較するつもりどの 暗号化された文字列、そのユーザ コマンドラインで入力。 彼らは、その場合には、同じである場合 場合に匹敵する文字列は、ゼロを返します それらが同じなら、その後だったと思います 暗号化されて生成されたパスワード 我々は印刷することができ、その場合には文字列、 当社のパスワードとリターンとしてその。 しかし、彼らが同じでないならば、その 私たちの推測が間違っていたことを意味します。 そして、我々に反復したい 次の有効な推測。 だから何この一方 ループは、やろうとしている。 それは私たちの推測を反復するために起こっている 次の有効な推測する。 我々がそれを言うときということに注意してください 我々の推測で特定の文字が持って ここまでの最大シンボルに達し チルダとして定義されたハッシュがあるため、ある それが最大のASCII値の文字です ユーザーがで入力できる 文字に達するキーボード、 最大シンボルは、次に我々は送信したい それは、最低限のシンボルにバックアップしている 再び、最低ASCII空間である ユーザーができる値のシンボル キーボードで入力します。 だから我々はそれを設定するつもりだ 最小シンボルに。 そして、我々は行くつもりです 次の文字に上。 それでは、どのように我々の推測です 反復するつもり? まあ、有効な文字は、A、Bであれば cは、次に我々は、で開始した場合 それがBに反復でしょ、それがよ Cに反復。 Cは、私たちの最大のシンボルなので、セットします に戻ってC、最小シンボル。 そして、我々は、インデックスを反復します 次の文字へ。 オリジナルの推測では、次のCだったのであれば 文字はNULLであることを行っている ターミネータ。 ダウンここで、文字であればことに気づく 我々は今、したいこと 増分は、ヌルターミネータだった 次に我々はそれを設定するつもりだ 最小シンボル。 推測では、その後、Cだったのであれば私たちの 新たな推測では、AAになるだろう。 そして、私たちのオリジナルの推測があった場合 その後CCCC、私たちの新しい推測 AAAAAになるだろう。 だからいつでも私たちは最大の文字列を達する 与えられた長さのもので、我々はしている 最小の文字列に実装しようとし 次の長さの、その意志 ただすべての文字のこと 最小シンボル。 さて、このチェックはここで何をやっている? まあ、インデックスは8位から移動した場合 9文字までの文字 - 従って我々は8、Cのようにを追加 我々の以前の推測 - その後、インデックスはに集中しようとしている 我々の推測の最後のヌルターミネータ 実際には意図されていない配列、 我々のパスワードで使用される。 我々は、その最後のヌルに焦点を当てているのであれば ターミネータは、次に我々は発見していない わずか8を使用して、有効なパスワード 存在しないことを意味した文字、 暗号化の有効なパスワード 与えられた文字列に。 と我々は言って、それを印刷する必要があり 我々は有効なを見つけることができなかった パスワード、および復帰。 したがって、このwhileループは反復しようとしている すべての可能な文字列の上に。 それが見つかった場合は、任意に暗号化している 予想される暗号化された文字列、それがよ そのパスワードを返します。 そしてそれは、それは、その後、何かを見つけることはありません それは、印刷、戻ります 何かを見つけることができませんでした。 さて、すべての反復処理がわかり 可能性のある文字列は、おそらくに起こっている しばらく時間がかかる。 実際にどのように見てみましょう 長いことかかります。 亀裂を作ってみましょう。 まあ、おっと - それは未定義と言う 地下室への参照。 pは仕様を設定し、ためにそう、覚えて 私たちはその地下室にもmanページ 地下室にリンクする必要があります。 さて、デフォルトではmakeコマンドを あなたことを知らない その機能を使用したい。 それでは、このクライアントのコマンドをコピーしてみましょう そして終了間際にアドオン それを、地下を結ぶ。 さて、それがコンパイルされます。 だから、与えられた上でクラックを実行してみましょう 暗号化された文字列 - シーザーのよう。 だからかなり速かった。 これは13日に終了したことに注意してください。 まあ、シーザーの暗号化されたパスワード 13であることを起こる。 それでは、別のパスワードを試してみましょう。 のは、ハーシュホーンの暗号化されてみましょう パスワードとことをクラッキングしてみてください。 だから我々はすでに達した気付く 3文字。 そして我々はすべての可能な反復処理している 3文字の文字列。 それは我々がすでに終了したことを意味 可能性のあるすべてのものを繰り返し処理し、 2つの文字列。 さて、それは次のようになりますがに行っている 私たちが到達する前にしばらく時間がかかる 4文字の文字列。 それは数分かかる場合があります。 それは数分かかりませんでした。 私たちは、4文字の文字列にしている。 しかし、今、我々はすべてを反復する必要があります 可能な4文字の文字列で、その それは多分10分かかることがあります。 そして、我々は、5つの文字に到達したとき 文字列は、我々はすべてを反復する必要があります それらの、どのかもしれない カップル時間かかる。 そして我々はすべての可能なを反復する必要があります 6文字の文字列、どの カップル日かかるとそうかもしれません。 だから、非常に長くかかる可能性があり、潜在的 可能なすべてを反復する時間 8文字より少ない文字列。 だから、これは必ずしもされていないことに気付く 発見のための非常に効率的なアルゴリズム パスワード。 あなたがそこにいると思うかもしれない より良い方法があります。 たとえば、パスワードZYX!32ab おそらく、非常に一般的なパスワードではありません 12345パスワードがあるのに対し おそらくより多くの一般的な。 パスワードを見つけようとするのので、1つの方法 より迅速に見ているだけである より一般的なパスワードで。 だから例えば、私たちは言葉を読むために試すことができます 辞書からのすべてを試す 当社のパスワード推測としてそれらの単語。 さて、多分パスワード それほど単純ではありません。 多分ユーザーはやや巧妙だった とに番号を付加してみてください 単語の終わり。 だから多分自分のパスワードはパスワード1だった。 だから、すべての単語を反復処理しようとすることができ いずれかの辞書で それの最後に追加。 そして多分それをやったら、よ それの最後に2を追加します。 それともユーザーが偶数となるようにしようとしています より賢い、と彼らはしたい パスワードは、 "ハッカー"であるが、彼らはしている E社のすべてのインスタンスを置き換えるつもり スリーと。 だから、あなたもこれを行うことができます。 辞書ですべての単語を反復 しかし、その文字を置き換える これらの数字と数字のように見える。 この方法だから、あなたはさらに多くをキャッチかもしれない かなり共通しているパスワード。 しかし、最終的には、唯一の方法は、次のことができます すべてのパスワードをキャプチャするには、ブルートにある すべてイテレート強制 可能性のある文字列。 だから最終的には、反復する必要がありますか 一文字からのすべての文字列の上に かかることがあります8文字、 非常に長い時間が、あなたはそれを行う必要があります。 私の名前はロブボーデンです。 そして、これはクラックです。