福野泰介の一日一創 - 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 など、出展します!

強いパスワードを作成するアプリを作りましたが、実際現代のパソコンでパスワードを突破するのにどの程度の時間がかかるか検証してみました。

手頃で高速でマルチコアに強そうという理由でGo言語を使ってみた結果、1秒間に18万パスワードをトライできる性能となりました。数字7桁のパスワードなら1分、8桁でも遅くとも10分で突破できます。


パスワードトライ中、全CPUフルに使い切ってます!
goルーチンを使って、1,2,3,4,5・・・と増やしてみたところ、Core i5の2コア4ハイパースレッディングでは、3が最も速いという結果となりました。ただ、最速でも1スレッドの2倍弱にしかなりませんでした。 そもそも、今回のプログラムは無駄が多いので、パスワードトライに特化してメモリの動的確保を0にすれば、更に10倍くらい速くもできるはず。 GPUをうまく使えば、飛躍的な高速化ができるかも?

アルファベット小文字+数字の36種類使ったパスワードの場合、数字のみ8桁の10の8乗と比較し、10の12.4乗と1万倍時間がかかります。10万分=70日=2ヶ月ちょっと、そこそこかかりますが、超重要なファイルであれば待てない時間じゃないですね。


パソコンを動かしっぱなしにするのは困る場合、クラウドを使うのも手です。さくらのクラウド、仮想1コアならなんと1時間9円で借りられます。 100コア借りて、仮に同じ性能がでれば1000分、17時間で結果が得られて、15,300円。(実性能を測ってみました、追記)


仮想20コアだと割安です。20コアを5台借りた場合、13,005円!(追記、そう単純ではありませんでした

無限にアタックできてしまうZIPファイルなどにかけるパスワード、少なくとも20桁くらいにはしておきたいですね。
強いパスワードを作ろう「パスワードメーカー」 パスワード付きファイルのリスク計算
さくらのクラウド、実際に仮想20コアを借りてみた編(追記)

ZIPファイルのパスワード取得プログラム(マルチコア対応 Go言語版)

package main import ( "flag" "fmt" "github.com/yeka/zip" "io/ioutil" "log" "os" "time" "sync" ) const LETTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" // 62 //const LETTERS = "0123456789abcdefghijklmnopqrstuvwxyz" // 36 //const LETTERS = "0123456789" // 10 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\n", start) tstart := time.Now() for i := start; i < 100000000; i += skip { pw := MakePassword(i) //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() { ncpu := 3 var wg sync.WaitGroup flag.Parse() filename := flag.Arg(0) for i := 0; i < ncpu; i++ { wg.Add(1) go Check(&wg, filename, i, ncpu) } wg.Wait() }

仮想コア1(=n)のクラウド、3台(=max)で分散させて動かすには、下記のようにオフセット(=off)を指定して動かします。

cloud0$ go run getpassword.go -f test.zip -n 1 -max 3 -off 0 cloud1$ go run getpassword.go -f test.zip -n 1 -max 3 -off 1 cloud2$ go run getpassword.go -f test.zip -n 1 -max 3 -off 2

見つかったらメールでお知らせや、自動的にクラウドを解約しておくなどもプログラムしておくといいですね!

2012年からスタートした一日一創、地味に活躍しているアプリを発見、その名は「パスワードメーカー」
ご要望にお応えして、紛らわしい文字を除く機能を追加した新バージョンです!

パスワードメーカー
開いた瞬間、生成したパスワードを選択した状態になるので、即時にコピー(Ctrl-C / Command-C)できます! 使う文字種、長さ、設定はURLに反映されるので、お好きな設定でブックマークしておくと便利です。

パスワードの強さはどう決めたらいいでしょう?

オンラインサービスのパスワードは何度か間違えるとロックされるので、そこまで気にしなくてもよかったりしますが、パスワード付きのExcelやzipファイルは要注意です。 何度間違えてもペナルティーがないので、力技の全探索が可能です。解読されるリスクを計算してみましょう。

例えば、数字4文字だと10の4乗、つまり1万通りのパスワードになります。IchigoJamのCPUでさえ1秒で5000万回計算できるので一瞬です。

数字を20文字まで伸ばすと10の20乗通り、全探索するのに、1秒に1兆回(10の12乗)試行できたとしても、10の8乗秒 = 1億秒 = 約3年かかる計算です。なかなか強くなりました。(ざっくり1日は10の5乗秒、1年は10の8乗秒と覚えておくと便利)

ただ、油断半禁物です。3台使えば1年、3000台使えば1日で解読できてしまいます。誰でも数千台とかを一時的に借りられるクラウド時代、非現実的な手段とは言えません。

オススメは、今回アプリの初期設定、アルファベット小文字、先頭は大文字の20文字。そこそこ短さながら10の27乗。1日で解読するためには3000億台のコンピューターがいるクラスです。大文字小文字を混ぜてほしいシステムにも対応。どうしても記号や数字が必要な時用にオプションもあり。

それでも、まだ不安な方のために、どーんと100文字設定を準備しました。10の100乗、記号などを含めると10の151乗までになるので、国家レベルどころか、全宇宙中のリソースを持ってしても現実的な時間で破ることはできないでしょう。(・・・と思いましたが、そもそも本プログラムの場合、乱数の品質で頭打ちです。強い乱数に関してはまた改めて)


パスワードメーカー」旧バージョン
こちら元になった2012年バージョン、そのまま残しておくことにしました。

パスワードメーカー」新バージョン
依存ライブラリがない、単一HTMLで動くシンプルでオープンなライセンスによるオープンソースなので、安全を自分でご確認いただけます。 また、自由に改造、再配布が可能なので、かわいくするのも、かっこよくするのも自由自在!

「ストップ、パスワードのつかいまわし」
自分の身は自分で守ろう、情報セキュリティの啓蒙用にもどうぞ。

links
- 一日一創 2012

3度目の明石高専にて、IoTプログラミング&情報セキュリティ講座!
1年生から5年生まで幅広く、学生30名以上が参加してくれ、大盛り上がり。
多数のうれしいツイート、ありがとう!

懇親会時に好評だった、チーム伊勢発のVFD単管時計を改造したVFD表示器
調子に乗って、スロットゲームつくってみました。プログラムと接続方法は、ブログ末尾で。

授業が終わった、16時半、自由参加の課外活動。定員上回る参加者!

情報系だけではない高専生、プログラミングやったことない人もまだまだ多数。来年からいよいよ日本の全小学生がプログラミングするので、高専生であれば、一歩先のIoTプログラミングくらいまでは押さえておこう。 非IT系xIoTが実は熱いよ!


講義スライドPDF「IchigoJamではじめてのプログラミング x 情報セキュリティー講座 in 明石高専
自由に使えるオープンデータです。どうぞいろいろアレンジして使ってください。


LEDに、ゲームに、IoTに、さすが高専生、サクサク進んだので、サーボ遊びもやりました!


楽しんでくれた感じの笑顔がうれしい!


眼鏡堅パン、喜んでくれました!
実は,登場当初は今のもう2段階堅かったw


和歌山高専出身で、高専の卒検をそのまま事業化している、株式会社CuboRex(キューボレックス)の社長、寺嶋さんにも会えました! その基幹部品を見せてくれました。サーボ信号でコントロールできるので、IchigoJamでもなんと遊べてしまう!?


電気情報工学科の2年生の授業にも少しおじゃましました。
なんと、2014年とかなり初期、神戸で開催したIchigoJamワークショップに参加してくれた小学生が高専生に!
ハンダ付け不要!持ち帰れるコンピューターづくりワークショップ IchigoJam x ビスケットボード


アナログな課外活動掲示板システムが楽しい!
スマホで更新できるようにしたり、デジタル化してどこかでも見えたりするのもおもしろいかも?


主催してくれた、いささかさんに、福井高専の先生が書いてくれた教科書と最新IchigoJam Sをプレゼント!
ステキで楽しい機会、ありがとう! きっかけになった高専カンファレンス、7/14、三ノ宮で開催ですよ!


本場、明石焼き(卵焼き)、自宅でも作ってみたい!そういえば、明石の人は一般的な卵焼きはなんと呼ぶ!?
福井県ではカツ丼がデフォルトソースカツ丼なので、一般的なカツ丼は卵カツ丼、タマカツ、と呼ばれてます。


明石高専、また来ます!

さて、次はどこの高専!?
高専いったことあるよマップ - 全国63キャンパス訪問率50%
jigインターンjig.jpへの就職に関しても受付中です!

「スロットゲーム with VFD」のプログラムと解説。

1 'SLOTGAME with VFD 10 CLS 20 FOR I=1 TO 3:CLT 30 IF I=1 A=RND(1000)+10000 40 IF I=2 A=RND(100)+A/100*100 50 IF I=3 A=RND(10)+A/10*10 60 LC 4,5:?DEC$(A,3) 65 R=I2CW(8,#8CC,2) 70 IF !BTN()||TICK()<20 GOTO 30 80 NEXT 90 WAIT20 100 IF BTN()=0 CONT ELSE RUN

CLTとTICK()を使って、ボタンが連続して押されないようにしているのがポイントです。
IchigoJam web で試す場合は、BTN()をINKEY()に変更してください。
VFDがなくても動きます。VFD無いときは、65行消してしまってOKです。
VIDEO3とかVIDEO5で文字を大きくするのもいいですね!
詳しく知りたい方は、シンプルな「IchigoJam BASICのリファレンス」を参照ください。


VFDモジュールCN2のVCCは5Vなので、IchigoJamのCN5の5Vと接続して、VFD表示器とIchigoJamを単一電源化! コントロールは、VFDモジュールCN1のSCL/SDA/GNDでIchigoJamとつないだI2C。I2CWコマンドで制御してます。


Slot Game with VFD / 動画 on YouTube

links
- VFDふぁん: VFD単管時計
- 【共立エレショップ】>> 【電子部品・半導体】/表示器/VFD(蛍光表示管) なんと1本103円〜

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