ブルートフォースアタック

 金曜日に先輩から個人的な頼みごとを頼まれる。
 なにやら、JavaScriptで書かれたパスワードサイトのパスワードを抜いてほしいらしい。なにやら怪しい頼みだが、そのサイトがどんなところかは一切聞かされてないため、まあパスワードを抜くぐらいなら良いですよ。と安請け合いをしてしまう。
 
 実際JavaScriptであれば、何とか暗号化解除できるだろうとタカを括っていたのがそもそもの間違いだった。実際に送られてきたJavaScriptを読んでみた結果、暗号化の手順は以下のような感じだった。
 


 1. パスワードの文字列をA、パスワード認証後にジャンプするサイトのアドレスをBとする。
 2. B+Aをひとつの文字列として、Aを鍵として暗号化する。ブロック暗号方式の一種で、Aのn番目の文字とBのn番目の文字を一対一で対応付けて、暗号化する。計算式はやや複雑なので省略。
 3. AよりもA+Bの文字列の方が長くなるので、Aの文字列が末尾まで到達したら、再び先頭に戻ってBの続きを暗号化する。
 4. 最後まで暗号化したら、escape関数を使ってもう一段階暗号化する。

 
 つまり、戻すときは逆手順で復号して、復号されたB+AのAの部分が、復号の鍵に使ったAと一致すれば、それは正しい鍵で、B+Aは元の文字列になった、という具合である。JavaScriptを読めばここまでは分かるのだが、ここから先が問題。
 
 どうやって鍵を見つければ良いのか……。
 
 一応末尾に鍵が隠れているのは分かっているが、鍵の長さによって、A鍵とA+B文字列の暗号化のかかる対応位置が違うので、計算式で簡単に導出できるというわけではない。なんというかDES暗号方式のブロック長が可変になったようなものである。
 
 有効な手段が無いため、力任せに調べる方向に転向。(ぉ
 
 どの言語で書くか悩んだのだが、Javaで書くよりC#で書いた方が面白そうだと思い、C#で解析プログラムをガリガリ書く。マルチスレッドで、他のスレッドからメインフォームの操作を行うには、デリゲートを使わなければならない等、細かな発見をしつつ、約5時間で完成。
 
 早速解析プログラムを走らせてみる。パスワードの長さは10文字。
 
 ……。
 
 遅 す ぎ る 。 _| ̄|○

 んー、小文字と数字限定の探索にも関わらず、この調子だと3日はかかりますねぇ……答えが出るまでに。記号や大文字小文字が混ざると、もはや絶望的ですね。クラック対策にどれぐらい有効なのかが身をもって知ることが出来ました(ぉ
 
 とはいえ他に何か良い方法を考えないと、これは厳しいですねぇ……。