虽然这是一项大学任务(家庭作业),但我已经找到了我能想到的最佳解决方案。我会用这个代码与问题匹配得到满分,但我特别允许在C#中开发它,而不是使用Java开发它,有点像“yeh,显示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”的情况显然需要更长的时间。
我希望有人可以就如何提高性能提供一些指示。