使用多个线程强制密码

And*_*den 3 c# algorithm brute-force

我正在研究我的10年级科学博览会项目,我有点碰壁了.我的项目正在测试并行性对强制md5密码哈希的效率的影响.我将使用1,4,1,3,3,6,12,128,512和1024个线程计算密码组合的数量/秒测试以查看其效率.我不确定我是否会做字典蛮力或纯粹的暴力.我认为字典更容易并行化; 只需将列表拆分为每个线程的相等部分.我还没写很多代码; 我只是在开始编码之前尝试计划它.

我的问题是:

  • 计算密码组合测试/秒是确定基于线程数的性能的最佳方法吗?

  • 字典还是纯粹的暴力?如果是纯粹的暴力,你会如何将任务分成可变数量的线程?

  • 还有其他建议吗?

she*_*tie 6

我并不想挫败你的热情,但这已经是一个很好理解的问题了.我将尝试解释下面会发生什么.但也许在另一个地区做你的项目会更好.如何"最大化MD5散列吞吐量",那么你不会仅限于查看线程.

我认为,在编写项目时,您需要提供某种分析,以确定何时适合并行处理,何时不适合.

每次CPU更改为另一个线程时,它必须持久保存当前线程上下文并加载新线程上下文.在单线程进程中不会发生此开销(除了像垃圾收集这样的托管服务).所以其他条件相同,添加线程不会提高性能,因为它必须执行原始工作负载以及所有上下文切换.

但是,如果您可以使用多个CPU(核心),则每个CPU创建一个线程意味着您可以并行化计算,而不会产生上下文切换成本.如果你有比CPU更多的线程,那么上下文切换将成为一个问题.

有两类计算:IO绑定和计算绑定.IO绑定计算可能会花费大量CPU周期来等待来自某些硬件(如网卡或硬盘)的响应.由于这种开销,您可以将线程数增加到CPU再次被最大化的点,这可以抵消上下文切换的成本.但是线程数量有限制,超过这个数量,上下文切换将占用线程花费阻塞IO的时间.

计算绑定计算只需要CPU时间进行数字运算.这是密码破解者使用的一种计算方法.计算绑定操作不会被阻止,因此添加比CPU更多的线程会降低整体吞吐量.

C#ThreadPool已经为您完成了所有这些 - 您只需添加任务,并将它们排队直到线程可用.新线程仅在线程被阻止时创建.这样,上下文切换最小化.

我有一个四核机器 - 将问题分解为4个线程,每个线程在自己的核心上运行,或多或少与我的机器强制密码一样快.

要认真并行化这个问题,你需要大量的CPU.我已经读过使用显卡的GPU来解决这个问题.

我对这里写的攻击向量进行了分析,如果它对你有用的话.彩虹表和处理器/内存权衡将是另一个有趣的领域.