福野泰介の一日一創 - create every day

反響あったパスワード付きZIPファイルの話、GPUを使った高速化、やはりありました!(Thanks! @JG1WWKさん)
パスワード付き ZIP ファイルを hashcat + JtR + GPU で総当たりしてみる - CUBE SUGAR CONTAINER

300万円するGPU、NVIDIA Tesla V100 を使うと、なんと秒間280億探索!
Go言語で作成しMacのCPUで動かした速度の16万倍のスピード!
一般用 RadeonⅦGTX1080TiFHC- でもこの半分程度の性能がでることにも驚きます。

ここで使われている hashcat というツールは、MacのGPUでも動きます。
PKZIP2が現行バージョンでは動きませんでしたが、同じアルゴリズムと思われるSHA2-256でのベンチマーク結果は・・・

hashcat -b ========================= * Device #1: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz, skipped. * Device #2: Intel(R) Iris(TM) Plus Graphics 640, 384/1536 MB allocatable, 48MCU Hashmode: 1400 - SHA2-256 Speed.#2.........: 127.8 MH/s (46.40ms) @ Accel:32 Loops:16 Thr:256 Vec:1

127.8MH/s、1秒に1.278億探索と高価なGPUの1/200ほどですが、Go言語のCPU版と比較して700倍!
さすがGPU!サクッとプログラムして使えるようにもなってみたいところです。

ZIPファイルでなくとも、サーバーやPCにハッシュ化されているパスワードにもリスクはあります。
2019年10月16日 “脱帽です”―9億3,000万ハッシュ/秒でようやく判明したケン・トンプソンのパスワードは…?:Linux Daily Topics|gihyo.jp … 技術評論社
偉大なハッカーの過去設定された記号付き7文字パスワードが4日間で破られたとのこと。
パスワードの使い回さなくとも、短いパスワードはハッシュ値からパスワードが特定され、気が付かない内にアクセスされる恐れがあります。

圧倒的なGPUパワーの前ではありますが、クラウドを使った実装編として、さくらのクラウドから仮想コアを借りて実験!
結果、MacBookPro Corei5 の倍のスピード!前回見積もり15,000円の半額でいけそうです!


次に、仮想20コアを借りてみます!


こちら残念ながら1仮想コアの倍にもなりませんでした。今の作りではメモリが競合してしまってだめなのかも。
こちらは前回見積もりを下回るため、今回のプログラムには向かないことが分かりました。


サーバーの解約も管理画面からボタンひとつで簡単!
GPUサーバーを借りる「」や「Google Cloud」も熱いですね!
8GPU搭載した1PFLOPS級を、10台借りれば京にも匹敵するコンピューティングパワーが使えてしまいます!


記号を使ったパスワード生成のため、ASCIIコードから記号を調べるのに、使用した IchigoJam web
スペースからチルダまで、ちょうど32文字ありました。数字アルファベット大文字小文字と加えて、94種類。1文字増える毎に94倍探索に時間がかかるようになります。13文字使うと10の25乗通りとなり、少し盛って秒間1兆回のアタックにも1兆秒(=3年くらい)耐えられる強度となります。

ただし、この強度はアルファベット小文字のみの18文字と同程度なので、記号が使える使えないの環境さを気にするよりは、ちょっと長めなパスワードがオススメです。ただし、意味ある単語のつながりだと、辞書攻撃され、圧倒的に弱くなるので注意。 強いパスワードづくりには、こちらのツールをどうぞ!「パスワードメーカー」推奨、20文字パスワード!

こちらパスワードに記号を使った場合の探索コードにして、分散起動にも対応させたGo言語のコードです。

package main import ( "flag" "fmt" "github.com/yeka/zip" "io/ioutil" "log" "os" "time" "sync" ) // make zip file with password // rm test.zip | zip -e --password=9999999 test.zip test.txt // rm test.zip | zip -e --password=passw test.zip test.txt // go run getpassword.go -f test.zip const LETTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !\"#$%&'()*+,-./:;<=>@[\\]^_`{|}~" // 10 + 26 * 2 + 32 = 94 //const LETTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" // 10 + 26 * 2 = 62 //const LETTERS = "0123456789abcdefghijklmnopqrstuvwxyz" // 10 + 26 = 36 beam5:313sec? //const LETTERS = "0123456789" // 10, beam6:5.7sec, beam7:55sec func MakePassword(n int) string { plen := 1 nlen := 1 nl := len(LETTERS) for { nlen *= nl if n <= nlen { break } plen += 1 } b := make([]byte, plen) for i := range b { b[i] = LETTERS[n % nl] n /= nl } res := string(b) return res } func Check(wg *sync.WaitGroup, filename string, start int, skip int) { defer wg.Done() var err error r, err := zip.OpenReader(filename) if err != nil { log.Fatal(err) } defer r.Close() f := r.File[0] if !f.IsEncrypted() { println("this zip file is not encrypted") return } fmt.Printf("Check %d skip %d\n", start, skip) tstart := time.Now() for i := start; i < 100000000; i += skip { pw := MakePassword(i) //time.Sleep(1 * time.Second) //println(pw) f.SetPassword(pw) r2, err := f.Open() if err != nil { print("ignore pw") } buf, err := ioutil.ReadAll(r2) if err != nil { r2.Close() continue } println("Password: " + pw) println(buf) r2.Close() break } println("Check end") tend := time.Now(); fmt.Printf("%fsec\n", tend.Sub(tstart).Seconds()) os.Exit(0) } func main() { var ( filename = flag.String("f", "test.zip", "a filename of zip") ncpu = flag.Int("n", 1, "cnt of go routien") ncpuoff = flag.Int("off", 0, "offset of start") maxcpu = flag.Int("max", 0, "step of search") ) flag.Parse() if *maxcpu == 0 { *maxcpu = *ncpu } var wg sync.WaitGroup for i := 0; i < *ncpu; i++ { wg.Add(1) go Check(&wg, *filename, i + *ncpuoff, *maxcpu) } wg.Wait() }

子供にも大人にも広めていきたい、圧倒的コンピューティングパワーを使った楽しいものづくり!
(追記、OpenCL/C言語 GPUプログラミングはじめのいっぽ on Mac

今週末「NT鯖江」にて、モノの名前が見えるメガネ「monoglass」や、最新 IchigoJama 1.4 など、出展します!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像