2016-11-12 19 views
0

私はこの宿題をやろうとしていますhttps://www.root-me.org/en/Challenges/Cryptanalysis/File-PKZIP私はそれを解読する関数を書くとき。なぜpkzipは2つのパスワードを受け入れますか?

import subprocess from time import sleep 

file = open('/home/begood/Downloads/SecLists-master/Passwords/' 
      'rockyou-75.txt', 'r') lines = file.readlines() file.close() for line in lines: 
    command = 'unzip -P ' + line.strip() + ' /home/begood/Downloads/ch5.zip' 
    print command 
    p = subprocess.Popen(
     command, 
     stdout=subprocess.PIPE, shell=True).communicate()[0] 
    if 'replace' in p: 

     print 'y\n' 
    sleep(1) 

それは=パスワードでscooterを停止します。

unzip -P scooter /home/begood/Downloads/ch5.zip replace readme.txt?   [y]es, [n]o, [A]ll, [N]one, [r]ename: 

が、私はそれを解凍するためにそれを使用するときに言った:

inflating: /home/begood/readme.txt 
    error: invalid compressed data to inflate 

そして、それは本当のパスワードです:14535。なぜpkzipが2つのパスワードを受け入れるのですか?

答えて

1

私は、使用されている暗号化が、元のPKZIPフォーマットの一部であった古い弱い暗号化であると推測します。

この暗号化方式では、圧縮データの前に12バイトの塩ヘッダーがあります。 PKWareの仕様から:

ヘッダが復号化された後、バッファ の最後の1又は2バイト は、インテル低に格納され、復号化されたファイルのCRCの上位ワード/バイトでなければなりませんバイト/高バイトオーダー。 のバージョン2.0より前のPKZIPは2バイトのCRCチェックを使用しました。 2.0より後のバージョンでは1バイトのCRCチェックが で使用されます。これは、パスワード が正しいかどうかをテストするために使用できます。

元々1.0仕様では2バイトでしたが、2.0仕様ではPKZIPの関連バージョンでは、チェック値が1バイトに変更されています難しいその結果、256個のランダムなパスワードのうち1つが最初のチェックに合格し、誤って解読された圧縮データの解凍を試み、エラーに陥るだけです。

これまでのところ、「受け入れられる」パスワードは2つ以上あります。しかし、パスワードがそれでも間違っていたことを検出するために、非常に多くのバイトの圧縮解除データを取ることはありません。

+0

RSAでパディングOracleの攻撃のように見えます! – Mr2uang

関連する問題