首頁 > 軟體

基於python的MD5指令碼開發思路

2022-03-30 19:03:22

開發思路

1、通過 string模組 自動生成字典;

2、使用permutations()函數,對字典進行全排列;

3、使用 md5模組 對全排列的字典進行轉換;

4、使用了多執行緒,分別對5~18位元字串進行md5碰撞,以防止時間太長(雖然現在也要很久)。

md5碰撞函數

def md5_poj(self, md5_value, k):
        if len(md5_value) != 32:
            print("error")
            return
        md5_value = md5_value.lower()
        # permutations() 全排列
        for item in permutations(all_letters, k):
            item = "".join(item)
            if item == "hongrisec@2019":
                print(item)
            if md5(item.encode()).hexdigest() == md5_value:
                print('n success: ' + md5_value + ' ==> ' + item)
                self.__mdfive = 1

其中 if len(md5_value) != 32 判斷所輸入的md5是否為32位元的

主函數

def main(self):
        NT_md5 = input("請填寫MD5:")
        start_time = time()
        t_list = []
        print("正在查詢...")
        # 新增執行緒
        t_first = threading.Thread(target=self.md5_first, args=(NT_md5,))
        t_first.daemon = 1
        t_first.start()
        for k in range(5, 18):
            t = Process(target=self.md5_poj, args=(NT_md5, k))
            # t = threading.Thread(target=self.md5_poj, args=(NT_md5, k))
            t.daemon = 1    # 守護程式
            t_list.append(t)
        # 啟動所有執行緒
        for i in t_list:
            i.start()
        # 當 __mdfive == 1 時結束所有執行緒
        while 1:
            if self.__mdfive:
                break
        print("n查詢結束!")
        print('使用了 %f 秒'%(time() - start_time))

完整程式碼指令碼

import threading
from multiprocessing import Process
from hashlib import md5
from itertools import permutations
from string import ascii_letters, digits, ascii_lowercase, ascii_uppercase
from time import time
all_letters = ascii_lowercase + '.,;@' + digits
class MDfive:
    def __init__(self):
        self.__mdfive = 0

    def md5_poj(self, md5_value, k):
        if len(md5_value) != 32:
            print("error")
            return
        md5_value = md5_value.lower()
        # permutations() 全排列
        for item in permutations(all_letters, k):
            item = "".join(item)
            if item == "hongrisec@2019":
                print(item)
            if md5(item.encode()).hexdigest() == md5_value:
                print('n success: ' + md5_value + ' ==> ' + item)
                self.__mdfive = 1
    # 判斷 md5 是否與空匹配
    def md5_first(self, md5_firstvalue):
        if len(md5_firstvalue) != 32:
        elif md5_firstvalue == "31d6cfe0d16ae931b73c59d7e0c089c0":
            print("n密碼為空!")
            self.__mdfive = 1

    def main(self):
        NT_md5 = input("請輸入MD5:")
        start_time = time()
        t_list = []
        print("正在查詢...")
        # 新增執行緒
        t_first = threading.Thread(target=self.md5_first, args=(NT_md5,))
        t_first.daemon = 1
        t_first.start()
        for k in range(5, 18):
            t = Process(target=self.md5_poj, args=(NT_md5, k))
            # t = threading.Thread(target=self.md5_poj, args=(NT_md5, k))
            t.daemon = 1    # 守護程式
            t_list.append(t)
        # 啟動所有執行緒
        for i in t_list:
            i.start()
        # 當 __mdfive == 1 時結束所有執行緒
        while 1:
            if self.__mdfive:
                break
        print("n查詢結束!")
        print('使用了 %f 秒'%(time() - start_time))

if __name__ == '__main__':
    MDfive().main()

到此這篇關於基於python的MD5指令碼的文章就介紹到這了,更多相關python MD5指令碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com