Хотя это университетское задание (домашнее задание), я нашел лучшее решение, которое только мог придумать. Я получил бы полную оценку с помощью этого кода, так как он соответствует этому вопросу, однако мне было специально разрешено разрабатывать его на C #, а не всем остальным, использующим Java, что-то вроде «да, покажите, что c # может сделать»; -)
Вопрос был:
Создайте программу для поиска пароля хэша SHA1 с использованием метода перебора, предполагая, что пароли состоят из 6 символов и могут содержать только строчные буквы a-z и 0-9.
Я создал запрос LINQ, и после того, как у меня появятся возможные комбинации, мне нужно запустить их через SHA1, чтобы получить хеш и сравнить его с предоставленным хешем пароля.
Я создал этот код:
public static string BruteForceHash(string hash)
{
var results = from c0 in Enumerable.Range(0, 36)
from c1 in Enumerable.Range(0, 36)
from c2 in Enumerable.Range(0, 36)
from c3 in Enumerable.Range(0, 36)
from c4 in Enumerable.Range(0, 36)
from c5 in Enumerable.Range(0, 36)
select new string(
new[]
{
Characters[c0],
Characters[c1],
Characters[c2],
Characters[c3],
Characters[c4],
Characters[c5],
}
);
string found = null;
Parallel.ForEach(results, (result, loopstate, a) =>
{
string hashed = SHA1(result, Encoding.Default);
if (hashed == hash)
{
found = result;
loopstate.Break();
}
});
if (found != null)
{
return found;
}
return "Not found.";
}
Теперь моя настоящая проблема заключается в том, что он быстро решает простые пароли («aaaaaa» мгновенно), но, очевидно, это займет больше времени, чем дальше пароль от «aaaaaa».
Я хотел бы надеяться, что кто-нибудь может дать некоторые советы о том, как повысить производительность.