2013-11-27 92 views
3

我在学校得到了有趣的任务。我必须找到哪个sha-1散列以我的生日为例。如果我出生于1932年5月4日,那么散列必须以040532结尾。任何建议如何找到它?如何找到SHA1哈希?

+0

不满意我的建议吗?我怎么能改进它? – Stefan

回答

2

从不同消息开始生成哈希。

最终会用这样的属性生成散列。这对蛮力来说并不坏,因为范围只有2 (或〜1600万),并且SHA是非常快

没有快捷方式SHA is a one way cryptographic hash function。特别是在这里,SHA具有“产生具有给定散列的消息不可行”的特性。


的输入应该是不同的,和一个简单的计数器就足够了。然而,基于所寻找的生日来生成准随机消息可能更有趣 - 例如,包括各种形式的日期和句子Mad Lib的风格。只要这不限制域,这样就不存在限定的散列,它就会像任何其他源消息一样工作。

3

我的解决方案在C#:

//A create Sha1 function: 
using System.Security.Cryptography; 
public static string GetSHA1Hash(string text) 
    { 
     var SHA1 = new SHA1CryptoServiceProvider(); 

     byte[] arrayData; 
     byte[] arrayResult; 
     string result = null; 
     string temp = null; 

     arrayData = Encoding.ASCII.GetBytes(text); 
     arrayResult = SHA1.ComputeHash(arrayData); 
     for (int i = 0; i < arrayResult.Length; i++) 
     { 
      temp = Convert.ToString(arrayResult[i], 16); 
      if (temp.Length == 1) 
       temp = "0" + temp; 
      result += temp; 
     } 
     return result; 
    } 

Source

然后一个随机字符串发生器:

private static Random random = new Random((int)DateTime.Now.Ticks);//thanks to McAden 
private string RandomString(int size) 
    { 
     StringBuilder builder = new StringBuilder(); 
     char ch; 
     for (int i = 0; i < size; i++) 
     { 
      ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
      builder.Append(ch); 
     } 

     return builder.ToString(); 
    } 

Source

,现在你可以猜解您的组合:

 string search = "32"; 
     string result = String.Empty; 
     int slen = 5; 
     string myTry = RandomString(slen); 

     while (!result.EndsWith(search)) 
     { 
      myTry = RandomString(slen); 
      result = GetSHA1Hash(myTry); 

     } 

     MessageBox.Show(result + " " + myTry); 

这将搜索哈希字符串与32快乐暴力破解:)

编辑结束:找到适合您的例子:HXMQVNMRFTe5c9fa9f6acff07b89c617c7fd16a9a043040532

+0

awww,不要给出完整的答案......代码本身很棒,但我发现给出答案字符串本身就是恶意的。 – tucuxi

+0

我认为给定的日期是假的日期:)如果他真的寻找他的生日日期 – Stefan

+0

谁知道,也许OP *真的是* 81岁。如果他是,为了保持他的好奇心而保持活力:-) – tucuxi