既知平文攻撃でパスワード付きzipを復号

既知平文攻撃とは

暗号化されているファイル内に、既知のファイルがあれば、それをヒントに復号する方法。

具体例として・・

file_A.zip の中に lock-key.jpg と TOP_seacret.doc の2つがある。

lock-key.jpgがググる等で入手できるファイルであった場合、
lock-key.jpgを用いて、file_A.zipを復号し、TOP_seacret.docを見る事ができる。

この攻撃方法を既知平文攻撃というそうだ。

 

検証

まず、pkcrackをインストールする。ここからダウンロード。

windowsで実行すると上手く行かなかったので、ubuntuで実施。
インストール方法は以下の記事を参考にする。

UbuntuでPkcrackを試す。
http://nameuntitled.hatenablog.com/entry/2016/12/07/001055

PkCrack を Mac OS X Mavericks で build する
http://qiita.com/ww24/items/c6387bd6775f37570103

pkcrackの使い方は、
-C [暗号化されたzipファイル]
-c [暗号化されたzipファイルの中で平文がわかるファイル]
-P [平文のファイルが入っている暗号化されていないzip]
-p [平文のファイル]
-d [出力先(復号したzipファイルの名前)]

具体例を実行すると、以下のようになる。

n-lab@ubuntu:~$ ./pkcrack -C ./flag.zip -c lock-key.jpg -p ./lock-key.jpg -d decrypt.zip
Files read. Starting stage 1 on Sat Aug 19 01:46:31 2017
Generating 1st generation of possible key2_255975 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 986 values at offset 248213
Lowest number: 948 values at offset 248202
Lowest number: 945 values at offset 247980
Lowest number: 928 values at offset 247965
Lowest number: 894 values at offset 247957
Lowest number: 883 values at offset 244764
Lowest number: 825 values at offset 244113
Lowest number: 820 values at offset 243180
Lowest number: 769 values at offset 243179
Lowest number: 758 values at offset 243175
Lowest number: 723 values at offset 243172
Lowest number: 702 values at offset 243171
Lowest number: 694 values at offset 243170
Lowest number: 657 values at offset 243162
Lowest number: 653 values at offset 243151
Lowest number: 652 values at offset 243149
Lowest number: 638 values at offset 243143
Lowest number: 621 values at offset 243106
Lowest number: 567 values at offset 243104
Lowest number: 546 values at offset 243103
Lowest number: 534 values at offset 243102
Lowest number: 510 values at offset 243073
Lowest number: 498 values at offset 243054
Lowest number: 476 values at offset 242992
Lowest number: 472 values at offset 242990
Lowest number: 396 values at offset 242989
Lowest number: 359 values at offset 242984
Lowest number: 321 values at offset 242983
Lowest number: 311 values at offset 242977
Lowest number: 310 values at offset 242939
Lowest number: 296 values at offset 242935
Lowest number: 270 values at offset 242934
Lowest number: 268 values at offset 242921
Lowest number: 244 values at offset 242915
Lowest number: 224 values at offset 242880
Lowest number: 215 values at offset 242879
Lowest number: 209 values at offset 242878
Lowest number: 188 values at offset 242877
Lowest number: 187 values at offset 242867
Lowest number: 186 values at offset 242866
Lowest number: 167 values at offset 242865
Lowest number: 164 values at offset 242670
Lowest number: 157 values at offset 242669
Lowest number: 141 values at offset 242655
Lowest number: 132 values at offset 242654
Lowest number: 112 values at offset 242652
Lowest number: 91 values at offset 242651
Done. Left with 91 possible Values. bestOffset is 242651.
Stage 1 completed. Starting stage 2 on Sat Aug 19 01:46:43 2017
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Stage 2 completed. Starting zipdecrypt on Sat Aug 19 01:46:46 2017
Decrypting TOP_seacret.doc (250d8b78ce908fe210d7c091)... OK!
Decrypting lock-key.jpg (037d8119e2c2884a4a665d91)... OK!
Finished on Sat Aug 19 01:46:46 2017

これで、パスワードが解除されたdecrypt.zipが手に入る。

パスワード自体がわかるわけでは無い。

とりあえず、CTFの問題を解くことができた。