如何优化碰撞目标SHA1哈希值的暴力破解代码的运行性能?
SHA1哈希碰撞暴力破解代码优化方案
以下是针对你提供的暴力碰撞SHA1代码的可落地优化方法,优化后性能可提升几十到上千倍不等:
- 砍掉无意义的磁盘IO操作:原代码最大的性能损耗来自循环写入、读取文件,磁盘IO速度远低于内存操作,生成的随机字节完全可以直接在内存中传递计算,不需要写入磁盘,这一项优化就能把速度提升至少100倍以上。
- 减少重复计算开销:原代码对同一段数据重复计算了3次SHA1、重复做了3次十六进制字符串转换,只需要计算一次SHA1值存到变量复用即可。同时不需要将哈希值转为十六进制字符串比对,直接用
digest()方法获取二进制哈希值,提前将目标哈希转为二进制格式做比对,比对速度可提升数倍。 - 移除高频打印操作:每次循环打印哈希值的控制台IO开销极大,如需要监控进度,可设置每10000次循环打印一次进度即可,日常运行完全可以关闭打印。
- 替换更快的随机数生成方案:
os.urandom是密码学安全的真随机数生成接口,生成速度较慢,暴力碰撞场景不需要高安全性的随机值,可替换为速度更快的伪随机数生成器,还可以批量生成多组待计算的随机字节,减少函数调用开销。 - 利用多核CPU并行计算:Python默认单进程只能利用一个CPU核心,这类计算密集型任务可以用
multiprocessing模块启动多进程,将计算任务拆分到多个核心并行执行,性能可随核心数线性提升。 - 运行时优化:用PyPy解释器运行代码,比默认CPython对循环逻辑的执行速度高3~5倍;极致性能需求下可调用更底层的SHA1计算库(如OpenSSL原生接口)替代hashlib的默认实现。
优化后单进程示例代码
import hashlib import os # 提前把目标哈希转为二进制,避免每次循环转换 TARGET_SHA1 = bytes.fromhex('37fbfdb93e39d41d53270184d050a83a08cb772e') piece_size = 1024 # 自定义的块大小 counter = 0 while True: # 直接在内存生成随机字节,不写盘 data = os.urandom(piece_size) # 只算一次SHA1,直接拿二进制结果比对 current_sha1 = hashlib.sha1(data).digest() if current_sha1 == TARGET_SHA1: print("匹配成功!") # 匹配到之后再写入文件即可 with open('./output_file', 'wb') as fout: fout.write(data) print(f"文件哈希: {current_sha1.hex()}") break # 每10000次打一次进度,不需要可以直接删除以下三行提升性能 counter +=1 if counter % 10000 == 0: print(f"已尝试次数:{counter}")
内容的提问来源于stack exchange,提问作者golePum
相关产品推荐
相关产品推荐

