c# - 使用多线程暴力破解密码

标签 c# algorithm brute-force

我现在正在做我的 10 年级科学博览会项目,但我有点碰壁了。我的项目正在测试并行性对暴力破解 md5 密码哈希的效率的影响。我将使用 1、4、16、32、64、128、512 和 1024 个线程计算它测试的每秒密码组合数,以了解它的效率。我不确定我会使用字典暴力还是纯暴力。我认为字典会更容易并行化;只需将列表分成每个线程的相等部分。我还没有写太多代码;我只是想在开始编码之前计划一下。

我的问题是:

  • 计算每秒测试的密码组合是否是根据线程数确定性能的最佳方法?

  • 字典还是纯粹的蛮力?如果是纯粹的蛮力,您将如何将任务拆分为可变数量的线程?

  • 还有其他建议吗?

最佳答案

我并不是要打击您的热情,但这已经是一个很好理解的问题了。我将尝试在下面解释会发生什么。但也许在另一个领域做你的项目会更好。 “最大化 MD5 哈希吞吐量”怎么样,那么您就不会局限于只看线程。

我认为,当您编写项目时,需要提供某种分析,说明何时适合并行处理,何时不适合。

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

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

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

计算密集型计算只需要 CPU 时间来处理数字。这是密码破解者使用的一种计算。计算密集型操作不会被阻塞,因此添加比 CPU 更多的线程会降低整体吞吐量。

C# ThreadPool已经为您处理了所有这一切——您只需添加任务,它就会将它们排入队列,直到有线程可用。新线程仅在线程被阻塞时创建。这样,上下文切换就被最小化了。

我有一台四核机器 - 将问题分解为 4 个线程,每个线程在自己的核心上执行,或多或少与我的机器可以暴力破解密码的速度一样快。

要认真并行处理此问题,您将需要大量 CPU。我读过 using the GPU of a graphics card来解决这个问题。

我写了一份攻击向量分析 here如果对你有用的话。彩虹表和处理器/内存权衡将是另一个有趣的领域来进行项目。

关于c# - 使用多线程暴力破解密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7700478/

相关文章:

c# - 如何通过 SOAP 使用 WCF 服务将大型 Zip 文件 (50MB) 传输到任何客户端?

algorithm - 使用 DOS 通配符暴力破解字符串的最快方法

c# - 认证2.0 |水疗 | id_token如何伪装成access_token来访问受限制的网络资源?

c# - EF4.1 : How to deal with items being added to an Object's collection

python - 更快更简洁地反转字符串中的句子?

javascript - 从 n 位数组返回 k 位数字的函数

algorithm - 这个求平方根算法的名称是什么?

python - 简单的暴力破解不工作

c++ - 找到气体容器的最小必要体积

c# - 能否使用 CER 来保证永远不会调用 finalize?