自分の手元のダイヤル錠を開けるパスワードクラッカーを 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入学式を卒業したばかりの入門者
- Mooで覚えるオブジェクト指向プログラミングシリーズを読了した方
- デザインパターンを「動くモノ」を作りながら学びたい方
技術スタック
- Perl v5.36以上(signatures使用)
- Moo(Minimalist Object Orientation)
さあ、ハッカーの道具箱作りを始めましょう!
