反響あったパスワード付き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 など、出展します!
