Seiichi Yonezawa — How creativity is helped by failure

パスワードを看破したい

とあるメールの添付ファイルのzipファイルにパスワードがかけられていました。パスワードは暗証番号と同じというメッセージが添えられていました。そこでふと思いついたのですが、単純なパスワードを破るにはどうすればよいだろうかと。まずは非常に単純なbashスクリプトを書きました。

#!/bin/bash
for i in {1..10000}
do
    unzip -o -P $i target.zip
done

このスクリプトは数字4桁分のパスワードを試行します。しかし、実行してみるとすぐさま問題に直面します。正しくないパスワードでもところどころに0KBのファイルが表示されてしまい、もしパスワードが正しくても-oオプションで不正なファイルで上書きされてしまうかもしれません。

How to recover a lost zip file password

この2つめの解答では、John the ripperというコマンドが必要なようですが、辞書ファイルの代わりに配列に書き換えればunzipのみでもできそうなので、もう少し修正してみることにしました。

#!/bin/bash
echo "ZIP-JTR Decrypt Script";
if [ $# -ne 1 ]; then
    echo "Usage $0 <zipfile>";
    exit;
fi
unzip -l $1
for i in {1..10000}
do
    echo -ne "\rtrying \"$i\" " 
    unzip -o -P $i $1 >/dev/null 2>&1 
    STATUS=$?
    if [ $STATUS -eq 0 ]; then
        echo -e "\nArchive password is: \"$i\"" 
        break
    fi
done

よく見てみるとunzip部分は最初とあまり変わらないのですが、パスワードが違う場合は出力をせずに$?が正常終了になるまで試行しているようです。また、上のスクリプトは4桁まで試行していますが、実際の答えは5桁の数列だったのでおよそ解読に3分ほどかかりました。意外と数字だけの組み合わせももっと時間がかかるようですね。例えばこの例の場合01234というパスワードはいつまでもヒットしないでしょうし、そもそも桁数を決め打ちにすることも馬鹿馬鹿しいもので、本来はwhileループを使うべきでしょう。ただ永久に終わらない可能性も考慮しなければなりませんが。

いわば原始的で力業な解読方法ですが、上記はブルートフォースアタックです。Wikipediaのパスワード長と解読時間の関係を見るとたとえ数字だけでも6桁や8桁はなかなか膨大な数字です。今回のパスワードが5桁だからこそネタでよかったのですが10桁だったらと考えると恐ろしいものです。また、このサイトもその気になればEmailとパスワードの組み合わせに加えてパスワードは記号入りなのでおそらく外から漏れない限りは絶対看破されないであろうと思っています。余談ですがDuckDuckGoでpassword strong 20と検索すると手軽にパスワード生成できるのが便利です。