C# Bruteforce - 多线程处理固定长度的密码

标签 c# multithreading passwords brute-force

我一直在研究一种算法来进行暴力破解。它更多的是个人利益而不是任何恶意使用 tbh。我一直对密码学和安全感兴趣。 我在应用程序上有一种模式,它会创建工作线程来执行给定长度的可能组合(每个长度 1 个线程)。

例如:您启动流程 - 然后它将以长度 1,2,3,4,5,6,7,8 开始,依此类推。 当较低长度的线程完成时,它会将可疑的密码长度增加 1 并产生一个新线程。 限制因素是 ProcessorCount -1(为了避免线程锁定或 GUI 线程被卡住:通常发现系统在有空闲内核的情况下更稳定)

因此,在 4 核系统上,您将处理密码长度 1-3,完成 1、2 和 3 后,将继续处理 4、5、6,依此类推。 长度 1-5 几乎立即完成。 3-4秒内6-7。 长度 8 可能需要 30-45 秒。 (这些时间取决于它是否是数字/字母数字等) 更多可能的字符会增加我们需要检查的键空间。

好的,这就是多线程的一种方法。 但是我要介绍的另一种方法稍微复杂一些。 它涉及使用多个线程来执行固定的疑似长度密码的完整 key 空间。 例如:我们知道它有 8 位长,所以使用我们所有的线程来更快地通过 8 位密码 key 空间。

我不确定如何进行。

例如: 假设我们的密码是 100(1000 种组合?) 我们的处理器有 8 个内核 所以这是 7 个潜在线程 - 如果我们采用我的 -1 方法。 每个线程大约需要测试 143 种组合。 我只是想知道如何有效地计算每个线程的起始位置。

例如:

线程 1 将从 000 开始到 142 结束 线程 2 将从 143 开始到 285 结束,等等

这对于 Numbers 来说听起来很容易,但是当您使用可能的字符数组时 - 'abcdefghijklmnopqrstuvwxyz1234567890'
如何计算起点和终点? 该字符串中有 36 个可能的字符。 3 个字母的密码是 36 x 36 x 36 = 46656 个字符组合吗?

好的,如果我有 7 个线程,每个线程处理 6666 种组合。 我如何获取这些开始和结束位置并将它们转换为比较字符串。

我想我的主要问题是这个: 如何将组合索引转换为由可用字符构造的字符串?

例如:

  • 1 可能是“a”
  • 2 将是 'b'
  • 37 可能是“ab”等

最佳答案

不建议你这样做,但如果这是你想要的方式,那么就这样考虑

字符 1 有 36 种可能性,字符 2 有 36 种可能性,对于字符 1 的每种可能性。字符 3 也是如此。
所以。 . .
取第一个字符的可能性并将其除以 6(线程)(7 将是困惑的)
每个线程给你 6 个
这是字符 1 的 6 种不同可能性,具有 36X36 种可能性

这意味着线程 1 执行所有以 a、b、c、d、e 和 f 开头的操作
然后线程 2 将执行 g、h、i、j、k 和 l
等等

关于C# Bruteforce - 多线程处理固定长度的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38609337/

相关文章:

c# - "An expression of non-boolean type specified"从 .Net 执行 SQL 时出错

c# - 使用 C# 在 Powerpoint 2013 中创建具有多个系列的图表

python - pytest:在线程中运行

c# - 实例化实现特定接口(interface)的所有类

c# - 我的 StreamReader 代码只读取每隔一行 c#

java - 如何通知第二个线程变量的更改

java - 为什么 ScheduledExecutorService 没有按预期工作?

java - 通过使用正则表达式在 Java 中输入密码

php - mcrypt 已弃用,有什么替代方案?

java - 如何通过 JNDI 更改 LDAP 密码