Информация в данном материале может оказаться полезной для тех, кто планирует использовать авторизацию в своем ПО, работать с хешами алгоритма шифрования MD5, а так же для тех, кому просто интересен принцип работы переборщиков паролей по словарю (брутфорсеров). Акцентирую внимание читателя на том, что программа работает исключительно с базами словарей (в коде осуществляется работа с txt-файлами, но это не столь принципиально), а не генерирует диапазоны символов для перебора.
Составление и кодирование алгоритма.
Условие задачи довольно простое: имея на руках MD5-хеш, подобрать коллизию (проще говоря, найти комбинацию символов, соответствующую этому хешу, то бишь пароль). Принцип и алгоритм работы приведен ниже.
- Открыть файл с хешем (input.txt) и открыть файл с паролями (pass.txt).
 
- Перевести все символы хеша в верхний регистр. Данная операция позволит корректно сравнивать его с генерируемыми нами хешами (при генерации все символы в хеше в верхнем регистре).
 
- Прочитать i-ю строчку файла, где i принадлежит отрезку [0; EndOfFile] (это не столь важно, т.к. строка из файла будет считываться до тех пор, пока не окажется пустой).
- Сгенерировать хеш прочитанной строчки.
 
- Сравнить с целевым хешем. Если равны – вывести строку, соответствующую сгенерированному хешу. Если не равны – продолжить шаги 3-5.
 
- Если достигнут конец файла, то уведомить пользователя о том, что пароль не найден. 
 
Если по какой-либо причине непонятны те или иные шаги, то, возможно, все вопросы отпадут после анализа кода (и соответствующих ему комментариев) получившейся программы.
Код:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Security.Cryptography;
 using System.IO;
 namespace MD5Brute
 {
   class Programm
   {
   static void Main(string[] args)
   {
   //убедиться, что в командной строке указано имя файла
   if ((args[0].Length == 0) || (args[1].Length == 0))
   {
   Console.WriteLine("Error: Missing Input file or Pass file");
   Console.ReadKey();
   }
   else
   {
   //открыть файл с хешем
   StreamReader reader = new StreamReader(args[0]);
   string EnemyHash = reader.ReadLine(); //прочитать хэш
   reader.Close();
   EnemyHash = EnemyHash.ToUpper(); //перевести все символы в верхний регистр
   //открыть файл с паролями
   reader = new StreamReader(args[1]);
   //перебрать каждую строку
   for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
   {
   string CurrentHash = string.Empty;
   //сгенерировать MD5-хеш
   foreach (byte b in new MD5CryptoServiceProvider().ComputeHash(Encoding.De fault.GetBytes(line)))
   {
   CurrentHash += b.ToString("X2");
   }
   //сравнить хеши
   if (CurrentHash == EnemyHash)
   {
   Console.WriteLine("Password: "+line);
   Console.ReadKey();
   return;
   }
   }
   Console.ReadKey();
   Console.WriteLine("No Password");
   return;
   }
   }
   }
 }
 
Формат запуска программы: md5brute.exe <%DIRECTORY%/input.txt> <%DIRECTORY%/pass.txt>
Итоги.
Конечно до полноценного брутфорсера этой программе далеко, но данные исходные коды вполне могут лечь в основу системы авторизации, продвинутого переборщика паролей, системы распределенных вычислений и чего-либо другого. По крайней мере, читатель теперь сумеет сгенерировать MD5-хеш.
