我一直在研究一种算法来进行暴力破解。它更多的是个人利益而不是任何恶意使用 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/