実現確率に基づいた辞書攻撃をしてみた話


昨日、4月1日に3月末に退社した社員のパスワード(ここに詳しくは書けない)がわからなくなって困っているという相談をあるお客さんから受けた。


その社員は、そこの上司に個人的な怨恨があるらしく「死ね!」と言い残して辞めていったのだそうだ。パスワードを教えなかったのは何かの腹いせなのだろうか。


ともかく、その社長の許可を取り、私はダメ元で総当り攻撃をしてみることにしたが、1時間ほどやってみて、無理そうだから切り上げ。


次に辞書攻撃をしてみることにした。辞書は英語辞書やWikipedia等から集めてきた私のお手製のものだ。これも1時間ほどやって無理そうだから切り上げ。


辞書の単語の組み合わせも試してみることにした。
私が攻撃に使う辞書はそれぞれの単語のIDなどに出現する頻度を統計的に求めてある。


これを使って、例えば、10%で出現する単語flowerと20%で出現する単語catを組み合わせたflowercatというパスワードは10%×20%=2%の確率であり得る(存在し得る)と仮定する。この確率が一定以上のものの組み合わせを求めるプログラムを書く。


仮にその確率がX以上であり得るものを生成するとしたら、a × b × … (a,b,…はそれぞれの単語の出現確率)と掛け算していき、それがXを下回ったら終了。


つまり、a × b × … < X が終了条件で、両辺の対数をとると
log (a × b × … ) < log X
log a + log b + log … < log X
なので、これを満たしたら終了。log Xは事前に計算できる定数だし、各単語の出現確率のlogも事前に1度だけ計算すればいいので、結局、掛け算はいらなくて足し算(or 引き算)のみで計算できる。(このアイデアは実現確率探索のもの。)


まあ、なんにせよしばらくやっていたら、なんとかパスワードがわかったらしく部屋中にbeep音が鳴り響いた。


上司に「死ね!」と言い残して退社する人ってどんなパスワードを使ってるんだろうと思って画面を見たら「golgo13」(ゴルゴ13)だった。


やれやれ。4月1日だからって、全く悪い冗談だ。


.