2016-11-12 80 views
0

我正在嘗試做這個功課https://www.root-me.org/en/Challenges/Cryptanalysis/File-PKZIP當我寫一個函數來破解它。爲什麼pkzip接受兩個密碼?

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接受兩個密碼?

回答

1

我認爲正在使用的加密是舊的非常弱的加密,它是原始PKZIP格式的一部分。

該加密方法在壓縮數據之前有一個12字節的鹽頭。從PKWARE規格:

頭被解密後,在緩衝液 最後1或2個字節應爲文件是 解密,存儲在英特爾低的高位字/字節的CRC的字節/高字節順序。版本 2.0之前的PKZIP使用2字節的CRC校驗;在2.0之後的版本中使用1字節的CRC校驗是 。這可以用來測試密碼 是否正確。

它最初是1.0規範中的兩個字節,但在2.0規範和相關版本的PKZIP中,檢查值已更改爲一個字節,以便像進行更多操作一樣進行密碼搜索難。其結果是,每256個隨機密碼中就有一個會導致首先通過該檢查,然後繼續嘗試解壓縮未正確解密的壓縮數據,然後纔會發生錯誤。

因此,遠遠超過兩個密碼將被「接受」。然而,不需要很多字節的解壓縮數據來檢測密碼是不正確的。

+0

看起來像是在RSA的填充Oracle攻擊! – Mr2uang

相關問題