Featured image of post Perlの総当たりパスワードクラッカーを、for文から再帰、Mooのクラスへ作り替えてIteratorにたどり着く全5回【目次】

Perlの総当たりパスワードクラッカーを、for文から再帰、Mooのクラスへ作り替えてIteratorにたどり着く全5回【目次】

パスワードの総当たりを3重のfor文で書くところから始め、桁数の増加で再帰に行き詰まり、next メソッドを持つ Moo クラスに閉じ込めて Iterator パターンにたどり着くまでの全5回の目次です。第1回から順に読む連載で、どの回で何が変わるかを一覧できます。

自分の手元のダイヤル錠を開けるパスワードクラッカーを Perl で作りながら、反復処理を直していく全5回の連載です。3桁を3重の for 文で総当たりするところから始め、桁数が増えて for 文も再帰も手に負えなくなる様子を体験し、次の候補を返す next メソッドを持つ Moo のクラスで直します。最後に、それが GoF の Iterator パターンだったと名前を付けます。

各回は前の回のコードを引き継ぐので、第1回から順に読むのが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で選んでください。

どこから読むか

  • 第1回 — 総当たりのパスワードクラッカーをゼロから書くなら。3桁のダイヤル錠を、3重の for 文で開ける
  • 第2回 — 桁数が増えて for 文を書き足せなくなったなら。再帰で何桁でも回せるようにして、何が残るかを確かめる
  • 第3回 — 再帰の複雑さをクラスに閉じ込める形から見たいなら。前提は第2回の、再帰で書いた brute_force 関数
  • 第5回 — Iterator パターンの考え方だけ先に知りたいなら。1億通りを配列に展開せず、1つずつ返す遅延評価の話

困りごとから探す

  • 第1回 — for 文のネストで全組み合わせを試す書き方を知りたい
  • 第2回 — 桁数を実行時に決めたいのに、for 文の深さは変えられない
  • 第2回 — 再帰で書いたら読みにくく、途中で止めて再開もできない
  • 第3回 — 組み合わせを作る処理と、試す処理が1つの関数に混ざっている
  • 第4回 — 攻撃手法を増やすたびに、ツール本体を書き換えたくない
  • 第5回 — 大量の候補を配列に入れて、メモリが尽きそうになる

記事一覧

第1回: Perlで3桁のダイヤル錠を総当たりで開ける

3桁の数字パスワードを特定する単純なスクリプトを作成します。for文のネストで総当たり攻撃を行う、最も基本的なアプローチです。

第2回: パスワードが4桁、5桁、N桁と増えて、for文のネストを書き足せない

パスワードの桁数が増えた時、for文のネストでは対応できなくなる問題に直面します。再帰呼び出しを使った解決策とその難しさについて解説します。

第3回: 総当たりの再帰が読みにくく、止めて再開もできない

Mooを使って「次のパスワード候補」を生成するクラスを作成します。複雑なループ構造をオブジェクトの中に隠蔽し、スッキリとしたコードを実現する方法を学びます。

第4回: 総当たりに辞書攻撃も足したいが、ツール本体は書き換えたくない

英単語リストを使った辞書攻撃機能を追加します。Iteratorインターフェースを守ることで、ブルートフォースと辞書攻撃を自由に切り替えるポリモーフィズムを学びます。

第5回: 8桁1億通りを配列に入れるとメモリが尽きる

完成した攻撃ツールを振り返り、これが「Iteratorパターン」であることを解説します。大量のデータをメモリに展開せずに扱う「遅延評価」の重要性を総括します。


対象読者

技術スタック

  • Perl v5.36以上(signatures使用)
  • Moo(Minimalist Object Orientation)

さあ、ハッカーの道具箱作りを始めましょう!

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。