虽然这是一项大学任务(家庭作业),但我已经找到了我能想到的最好的解决方案.我会用这个代码来完成满分,因为它与问题匹配,但我特别允许在C#中开发它而不是使用Java的所有其他人,有点像"yeh,显示c#可以做什么"挑战;-)
问题是:
使用强力技术创建一个程序来查找SHA1哈希的密码,假设密码长度为6个字符,并且只能包含小写的az和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.";
}
Run Code Online (Sandbox Code Playgroud)
现在我真正的问题是它快速解决了简单的密码("aaaaaa"是即时的)但显然需要更长的密码远离"aaaaaa".
我希望有人能提供一些关于如何提高性能的指示.
如果您对实现相当满意,那么我将使用YourKit或DotTrace等性能分析器运行代码,您可以查看代码中的热点并从那里进行调整。有时,当您使用像 LINQ 这样的语法糖代码时,这样做很不错,这样您也可以了解幕后真正发生的事情......