【问题标题】:C# Bruteforce - Multithreading a fixed length passwordC# Bruteforce - 多线程固定长度密码
【发布时间】: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


【解决方案1】:

不建议你这样做,但如果这是你想走的路,那么考虑一下

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

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

【讨论】:

    【解决方案2】:

    不要让每个线程精确搜索搜索空间的 1/n,而是考虑将其分成“逻辑”部分(即对有意义) .这意味着您将创建比您拥有的内核更多的作业,并且您的每个线程在完成前一个作业后只能选择其中一个作业。

    例如对于数字 8 位密码,您可以创建任务 0 到 9,其中任务 n 是“搜索所有以数字 n 开头的 8 位密码”。对于字母数字密码,您可以创建 36 个任务:“搜索所有以 'a' 开头的密码”、“... 以 'b' 开头”、...、“以 '0' 开头”。

    将所有任务放入一个池中,启动任意数量的线程并从池中为它们分配一个任务。一旦任务完成,让线程从池中获取一个新任务,直到它耗尽。

    您可以为此使用Thread Pool,但坦率地说,我会自己创建一个简单的机制,其中工作池是List<Action>,您使用简单的locking 机制将任务从列表中拉出一旦上一个动作完成。


    编辑:创建了一个简单的示例。它看起来像很多代码,但它相当简单。没有经过真正的测试,但应该能让你明白我的意思。

    private List<Action> jobs = new List<Action>();
    private object jobsLock = new object();
    
    // This is the CPU-intensive function that does the actual work of checking passwords
    private void TestPasswords(int length) {
        for(int i = 0; i < (1 << length); i++)
        {
            // Simulate testing the password.
            Thread.Sleep(100);
        }
    }
    
    // Each thread is dispatched with this action.
    // It keeps pulling jobs from the queue and executing them until no more remain.
    private void DoWork()
    {
        while(true)
        {
            Action job = null;
            lock(this.jobsLock)
            {
                if(this.jobs.Count == 0)
                {
                    return;
                }
    
                job = this.jobs[0];
                this.jobs.RemoveAt(0);
            }
    
            if(job != null)
            {
                job();
            }
        }
    }
    
    // Tester method
    public void Run()
    {
        // For all password lengths from 1 to 8, generate a job to test passwords.
        // You probably want to divide these differently (e.g. let i be the job that tests
        // all 1 - 8 character passwords starting with the character i, such that
        // all jobs are approximately of equal length).
        for(int i = 1; i <= 8; i++)
        {
            int length = i;
            this.jobs.Add(() => TestPasswords(length));
        }
    
        // Create a background thread for each of the cores except one, 
        // and let them execute the DoWork loop until the queue is empty.
        // You may build a ContinueWith or WaitAll mechanism to catch the results
        // and build some callback stuff to get the progress.
        int numberOfCores = 8;
        for(int i = 0; i < numberOfCores - 1; i++)
        {
            Task.Run(DoWork);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多