プログラミングの勉強として、簡単に書けそうなパスワード解析ソフトを作ってみた。
辞書攻撃をするので、パスワードリストが必要。
英語で調べるとたくさん見つかるけど、自分は
hashcat-rules-collection/README.md at main · n0kovo/hashcat-rules-collection · GitHub
にあるWordlist tests - Google Sheetsを参考にした。
日本人向けのパスワードリストは
Index of /pub/wordlists/languages/Japanese
くらいしか見つからなかった。約10万語のリストで、非日本語圏でも上位にあるようなパスワードは省かれているよう
・シェルスクリプト(Linux)
7zipを使って復号化しているので、7zやtar.gzやrarも解析できる。ただしzipと比べると処理には時間がかかる
#!/bin/sh file=$1 cat passwordlist.txt | while read line do 7z e -y "-p$line" $file > /dev/null 2>&1 if [ "$?" -eq 0 ] then echo "パスワードは $line です。" break fi done
・python
自前の環境だと、スピードは↑のシェルスクリプトの10倍くらい。
復号化にはpyzipper
GitHub - danifus/pyzipper: Python zipfile extensions
を使用。暗号化方式がAESではない場合は別のモジュールを使う必要があるかも
import sys import pyzipper args = sys.argv file = args[1] z = pyzipper.AESZipFile(file,"r",compression=pyzipper.ZIP_DEFLATED,encryption=pyzipper.WZ_AES) with open('passwordlist.txt') as file: for line in file: try: z.extractall(pwd=str.encode(line.rstrip())) break except: pass print("パスワードは ",line.rstrip()," です。")
C++で書いたらもっと速くなるかもと思ったけど、zipのパスワードを復号化できるライブラリが分からず断念。
有名なjohn the ripper
https://github.com/openwall/john
というパスワードクラッカーでは、まずファイルからハッシュを取り出し、それとパスワードを照合するので、もっと速い解析が可能なよう(具体的にどのような仕組みになっているのかは分からなかった)。実際に試してみたところ、↑のpythonの20倍ほどのスピードが出た。
追記
↑のpythonのコードを、一行ずつファイルから読み込んで処理する方法からいったんキューに読み込む方法に変えてみたら、それだけで10倍以上のスピードになった。ここまで変わるとは…import sys import pyzipper from collections import deque args = sys.argv comp = args[1] WordlistFilename="wordlist" z = pyzipper.AESZipFile(comp,"r",compression=pyzipper.ZIP_DEFLATED,encryption=pyzipper.WZ_AES) queue=deque() with open(WordlistFilename) as w: while True: line=w.readline() if not line: break queue.append(line.rstrip()) for i in range(len(queue)): password=queue.popleft() try: z.extractall(pwd=str.encode(password)) print("パスワードは ",password," です。",i+1,"回の試行で成功しました。") break except: pass del queue
工夫すればもっと速くなるかも?
追記2
docker+pypyで動かしたら、コード一切変えずにそのままで3倍速になった。すごい…
追記3
C++でlibzipを使って書いてみた記事。さすがに速いです。bogamp.hatenablog.com