我一直在研究一个算法来执行暴力破解。它更多的是个人利益而不是任何恶意使用tbh。我一直对密码学和安全感兴趣。 我在应用程序上有一个模式,它将创建工作线程以对给定长度(每个线程长度为1个线程)行使可能的组合。例如:你开始的过程 - 然后它将以长度1,2,3,4,5,6,7,8等开始。 随着长度较低的线程完成,它会将可疑密码长度增加1并产生一个新线程。 限制因素是ProcessorCount -1(为了避免线程锁定或GUI线程被冻结:通常发现系统在空闲内核时更稳定)C#暴力 - 多线程固定长度的密码
因此,在4核心系统上,您将使用密码长度1- 3,当1,2和3完成后,它将移动到4,5,6等等。 长度1-5几乎立即完成。在3-4秒内6-7。 长度8需要30-45秒。 (这些时间取决于它是数字/字母等) 更多可能的字符增加了我们需要检查的密钥空间。
好的,这是多线程的一种方法。 但我想介绍的另一种方法是更复杂一点。 它涉及使用多个线程来行使固定怀疑长度密码的完整密钥空间。例如:我们知道它的长度是8位数,所以使用我们所有的线程来更快地获得8位密码密钥空间。
我不确定如何继续。
如: 让我们想象我们的密码是100 我们有自己的处理器 8个内核所以这是7 - 如果我们与我-1办法去潜在的线程(1000组合?)。 这可以解决大约143个组合来测试每个线程。 我只是想知道如何有效地计算每个线程的起始位置。
例如:
线索1将与000,并在142 线程2端开始在285等与143和端将开始
这听起来很容易用数字,但是当使用的阵列的可能的字符 - 'abcdefghijklmnopqrstuvwxyz1234567890'
如何计算出开始点和结束点? 该字符串中包含36个可能的字符。 3个字母的密码是36 x 36 x 36 = 46656个字符组合吗?
好吧,如果我有7个线程在每个6666组合上工作。 如何获取这些开始和结束位置并将它们转换为比较字符串。
我想我的主要问题是这个: 如何将组合索引变成由可用字符构造的字符串?
如:
- 1可能会是 'A'
- 2将 'B'
- 37很可能是 'AB' 等
你看过这个吗? https://msdn.microsoft.com/en-us/library/ff963552.aspx – 1615903
如果'a'是可能性,并且蛮力计算寻找3个字符长的密码,它将需要''(一个开放空间)在你可能的人物列表中,否则它永远不会到达那里。它会以'aaa'开头,另一个问题是如果你将它添加到你的列表中,那么可能的密码可能是'a'和'a',所以你需要考虑这个 – Neil
是的,可能的K字母词的数量有n个符号是n^k。例如,有10个十进制数字,可能的3位数字的数量是... 10^3。甚至在获得10个字符的密码之前,你的蛮力方法将需要一段时间。 36^7是78亿美元而变化。 –