天天看點

【Python腳本進階】1.3、第一個腳本:UNIX密碼破解機

目錄

​​一、簡介:​​

​​1.1、概述:​​

​​1.2、crypt:​​

​​二、示例:​​

​​2.1、示例1:​​

​​2.2、示例2:​​

​​思路:​​

​​main()函數​​

​​testPass()函數​​

​​2.3、注:​​

​​split():​​

​​2.4、總結:​​

一、簡介:

1.1、概述:

編寫UNIX密碼破解機時,需使用UNIX計算密碼hash的crypt()算法

The crypt module is not supported on Windows(Windows不支援crypt子產品)

1.2、crypt:

crypt.crypt(word, salt=None)

驗證 Unix 密碼的函數

啟動Python 解釋器,Python 标準庫中已自帶有crypt 庫。要計算一個加密的UNIX 密碼hash, 隻需調用函數crypt.crypt(), 并将密碼和salt作為參數傳遞給它。該函數會以字元串形式傳回密碼的hash

【Python腳本進階】1.3、第一個腳本:UNIX密碼破解機
【Python腳本進階】1.3、第一個腳本:UNIX密碼破解機

二、示例:

2.1、示例1:

明文是單詞egg 和salt 就是開頭的兩個位元組是HX

使用crypt()函數快速計算密碼的hash。将庫導入之後, 我們将密碼“ egg" 與salt"HX"傳遞給函數。該函數傳回密碼的hash一一字元串為“ HX9LLTdc/jiDE" 。

​>>> import crypt >>> crypt.crypt("egg","HX") 'HX9LLTdc/jiDE'​

【Python腳本進階】1.3、第一個腳本:UNIX密碼破解機

2.2、示例2:

思路:

可以編寫一個程式來周遊整個字典, 将每一個單詞加上指定的salt 的計算結果都與加密的密碼hash 做比較

首先要建立兩個函數: main 和testpass。根據各自特定的作用, 将程式分隔成互相獨立的函數,便于重用代碼,易于閱讀。

main()函數

用main 函數打開加密密碼檔案” password.txt", 并逐行讀取密碼檔案中的内容。每一行中的使用者名和密碼hash 都是分隔開的。對每個密碼hash, main 函數都調用testPass()函數, 嘗試用字典中的單詞破解它。

testPass()函數

testPass()函數會以參數形式獲得加密的密碼hash, 并在找到密碼或搜遍字典無果後傳回。要注意的是, 該函數首先将加密的密碼hash 的前兩個字元視為salt, 并提取出來。然後, 它打開字典并周遊字典中的每個單詞, 用每個單詞和salt 計算一個新的加密密碼hash。

如果計算結果與我們加密密碼hash 比對, 函數會列印一條消息顯示找到密碼, 并傳回。否

則, 它會在詞庫中繼續對每個單詞進行測試。

​​import crypt
def testPass(cryptPass):
    salt = cryptPass[0:2]
dictFile = open ('dictionary.txt', 'r')
for word in dictFile.readlines():
        word = word.strip( '\n' )
        cryptWord = crypt.crypt(word, salt)
        if cryptWord==cryptPass:
            print("Found Password: " + word + "\n")
        print("Password Not Found.\n")
        



def main():
    passFile = open('passwords. txt')
    for line in passFile.readlines():
        if ":" in line:
            user = line.split(':')[0]
            cryptPass = line.split(':')[1].strip(' ')
            print("Cracking Password For: " + user)
            testPass(cryptPass)

if __name__ == '__main__':
    main()​​      
【Python腳本進階】1.3、第一個腳本:UNIX密碼破解機

2.3、注:

split():

簡介:

通過指定分隔符對字元串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字元串

文法:

str.split(str="", num=string.count(str)).

str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、制表符(\t)等。

num -- 分割次數。預設為 -1, 即分隔所有。

傳回分割後的字元串清單。

2.4、總結: