網(wǎng)站首頁 編程語言 正文
開發(fā)思路
1、通過 string模塊 自動生成字典;
2、使用permutations()函數(shù),對字典進(jìn)行全排列;
3、使用 md5模塊 對全排列的字典進(jìn)行轉(zhuǎn)換;
4、使用了多線程,分別對5~18位字符串進(jìn)行md5碰撞,以防止時間太長(雖然現(xiàn)在也要很久)。
md5碰撞函數(shù)
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位的
主函數(shù)
def main(self): NT_md5 = input("請?zhí)顚慚D5:") 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 # 守護(hù)程序 t_list.append(t) # 啟動所有線程 for i in t_list: i.start() # 當(dāng) __mdfive == 1 時結(jié)束所有線程 while 1: if self.__mdfive: break print("\n查詢結(jié)束!") 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 # 守護(hù)程序 t_list.append(t) # 啟動所有線程 for i in t_list: i.start() # 當(dāng) __mdfive == 1 時結(jié)束所有線程 while 1: if self.__mdfive: break print("\n查詢結(jié)束!") print('使用了 %f 秒'%(time() - start_time)) if __name__ == '__main__': MDfive().main()
原文鏈接:https://www.cnblogs.com/spmonkey/p/16067719.html
相關(guān)推薦
- 2022-06-16 golang默認(rèn)Logger日志庫在項目中使用Zap日志庫_Golang
- 2022-04-20 Python設(shè)計模式結(jié)構(gòu)型代理模式_python
- 2021-12-15 Android?studio導(dǎo)出APP測試包和構(gòu)建正式簽名包_Android
- 2022-12-26 python-httpx的使用及說明_python
- 2022-07-25 Python文件操作實(shí)戰(zhàn)案例之用戶登錄_python
- 2022-03-16 Quartz.Net使用方法詳解_C#教程
- 2022-03-23 詳細(xì)聊聊Redis的過期策略_Redis
- 2022-04-06 Android中卡頓優(yōu)化布局詳細(xì)介紹_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支