zipファイルのパスワード解析ソフトを自作してみた

プログラミングの勉強として、簡単に書けそうなパスワード解析ソフトを作ってみた。

辞書攻撃をするので、パスワードリストが必要。
英語で調べるとたくさん見つかるけど、自分は
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