【发布时间】:2016-12-01 06:00:27
【问题描述】:
我一直在研究一种算法来进行暴力破解。它更多的是个人利益,而不是任何恶意使用。我一直对密码学和安全性很感兴趣。 我在应用程序上有一种模式,它将创建工作线程来执行给定长度的可能组合(每个长度 1 个线程)。
例如:您开始该过程 - 然后它将以长度 1,2,3,4,5,6,7,8 等开始。 随着较低长度的线程完成,它会将可疑密码长度增加 1 并产生一个新线程。 限制因素是 ProcessorCount -1(为了避免线程锁定或 GUI 线程被冻结:通常发现系统在空闲内核时更稳定)
因此,在 4 核系统上,您将使用 1-3 的密码长度,当 1、2 和 3 完成后,它将继续使用 4、5、6 等等。 长度 1-5 几乎立即完成。 6-7 在 3-4 秒内。 长度 8 可能需要 30-45 秒。 (这些时间取决于它是数字/字母数字等) 更多可能的字符会增加我们需要检查的键空间。
好的,这是多线程的一种方法。 但是我要介绍的另一种方法要复杂一些。 它涉及使用多个线程来执行一个固定的可疑长度密码的完整密钥空间。 例如:我们知道它是 8 位长,所以使用我们所有的线程来更快地通过 8 位密码键空间。
我不确定如何继续。
例如: 假设我们的密码是 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' 等
【问题讨论】:
-
如果 'a' 是可能的,并且蛮力计算正在寻找一个 3 个字符长的密码,它也需要 ' '(一个开放空间)在您可能的字符列表中,否则它会永远不要到达那里。它会以 'aaa' 开头,另一个问题是如果你确实将它添加到你的列表中,那么可能的密码可能是 'a' 和 'a' 所以你需要考虑到这一点
-
是的,有n个符号的可能k字母词的数量是n^k。例如,有 10 个十进制数字,可能的 3 位数字的数量是 ... 10^3。甚至在您获得 10 个字符的密码之前,您的蛮力方法也需要一段时间。 36^7 是 780 亿,而且还在变化。
-
至于如何将索引转为字符串,很简单。进行基础转换。也就是说,以 36 为基数输出您的数字。该算法与转换为任何其他基数没有什么不同。
标签: c# multithreading passwords brute-force