この前、はてなブックマークでpdfcrackというGPL2で配布されているソフトを知り、バージョン0.11をダウンロードして試してみました。READMEやMakefileを見たところ、gccがあればOKみたいで、openSUSE 10.3の環境で問題なくmakeできました。
$ pdfcrack target.pdf
とすると、PDFファイルの開くパスワード(user password)を調査できます。これ以上に印刷権限とか変更したい場合は権限パスワード(owner password)をクラックする必要があって、以下のように実行します。
$ pdfcrack -o target.pdf
もしくは
$ pdfcrack -o -f target.pdf
パスワードの試行は1桁から順に増えていきますので、桁数がわかっている場合は
$ pdfcrack -o -n 6 -m 7 -f target.pdf
として、これは6桁から7桁の範囲となります。
ぱっとソースを見た感じと、解析中の表示を見ていると、パスワードを総当りで試していく方法みたいで、1桁目からa-zA-Z0-9の文字列でカウントされています。
$ pdfcrack -b
にて実行するマシンのクラック速度を測定することができて、Xeon 3.6GHzのマシンで以下のように出ました。
Benchmark: Average Speed (passwords / second): PDF (40, user): 925920.8 PDF (40, owner): 489448.1 PDF (40, owner, fast): 1111111.1 PDF (128, user): 40401.8 PDF (128, owner): 19159.4 PDF (128, owner, fast): 40401.8
この例では128bitで暗号化されたファイルでも速ければ1秒間に40400回のペースでクラックできるとのことです。これは例えば4桁のパスワードなら366秒、約6分ですべて試せる計算になります。実際には、1桁から試しますから6分にプラスアルファかかるのですが、3桁のパスワードには
62x62x62/40400=5.9秒
しかかかりませんので、誤差範囲の範疇ですね。
これが5桁のパスワードとなると、
62x62x62x62x62/40400=22676秒=6時間17分
となります。結構な時間ですが、一晩かからない程度です。試しに5桁で1桁目(最後の文字)がbで終わるパスワード「XXXXb」のPDFで試したら17分ほどでクラックできました。つまり計算上は最長6時間強かかるけど、パスワードによってはすぐに判明することもあり、運にも左右されるということです。
6桁のパスワードとなると、
62x62x62x62x62x62/40400=1405946秒=16日6時間32分
と、かなりかかるようになります。8桁では170年余りと、パスワードを8桁以上にせよと推奨されている理由もなるほどです。しかし単語帳にあるパスワードは別途、
$ pdfcrack -o -w /usr/share/dict/words -f target.pdf
とすると文字列のリストを参照してすぐにクラックできますので、破ってほしくなければ単語になった文字列を使わないほうがいいのは常識ですね。
ちなみに、PDFのパスワード桁数の最大は32文字なのですが、これだと総当りに1.8x1045年かかります。
1/16追記
このpdfcrackですが、大文字小文字のアルファベットと数字の組み合わせのパスワードしかクラックできないんじゃないの? と思い、試しに記号を含んだパスワードのPDFファイルを作ってやってみたところ解読できませんでした。つまりこのツールに対抗するのに一番簡単な方法はアルファベットと数字以外の文字をパスワードに使うっていうことですね。