2013-09-16 37 views
0

經過24小時的編程後,我終於破解了,我想製作一個C#WindowsForm應用程序,它向您展示散列十六進制字符串輸入的值,如hashcalc。 我只能使用它來輸入文本字符串,即使用Google搜索它。 爲了演示,輸入060201080808040602040909080909003583150369840500應該輸出d8f6b336a4df3336bf7de58a38b1189f6c5ce1e8 而不是a6879cb4510b18e8f41b3491ce474fd2ff9e2979 另外這是SHA1散列所以保持它只是在那,謝謝!從C#中的十六進制/二進制字符串計算SHA1

+0

所以你在SHA1中成功地散列了一個字符串,但實際上是想散列由你所擁有的十六進制字符串表示的「字節數組」? – olydis

+1

如果是這樣的話,看看http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and-vice-versa – olydis

回答

0

我覺得我不太瞭解你的問題。你可以任意散列任何輸入和輸出。爲了達到這個目的,你很可能使用Encoding類和你選擇的編碼並調用GetBytes()方法。然後,您採取SHA1類並讓它計算散列值。而對於用戶文本,您可以告訴字符串類使用十六進制數字格式。這不僅適用於SHA1類;)

0

您需要導入命名空間:

using System.Security.Cryptography 

,並呼籲

var hash = new SHA1CryptoServiceProvider().ComputeHash(inputBytes); 

產生的哈希值。

如果你的問題是關於十六進制字符串轉換爲字節,這裏是一個完整的示例,演示如何解析輸入和格式化輸出:

var input = "060201080808040602040909080909003583150369840500"; 

// parse the input into a byte[] 
var inputBytes = Enumerable.Range(0, input.Length/2) 
          .Select(i => input.Substring(i*2, 2)) 
          .Select(s => byte.Parse(s, NumberStyles.HexNumber)) 
          .ToArray(); 

var hash = new SHA1CryptoServiceProvider().ComputeHash(inputBytes); 

var outputHexString = string.Join(" ", 
    hash.Select(b => b.ToString("X")).ToArray()); 

Console.WriteLine(outputHexString); 

下面是它如何工作的:http://ideone.com/BE7ecU

1

對於這090505050509050009080003000605003569190380108300 我有3b8d562adb792985a7393a6ab228aa6e7526410a,而不是3b8d562adb792985a7393a6ab228aa6e752641a

我認爲最後一個字節是錯誤的。

0
private void button1_Click(object sender, EventArgs e) 
{ 
    string input= "060201080808040602040909080909003583150369840500"; 
    SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); 
    byte[] hash = sha1.ComputeHash(ConvertHexStringToByteArray(input)); 
    string delimitedHexHash = BitConverter.ToString(hash); 
    string hexHash = delimitedHexHash.Replace("-", ""); 

    MessageBox.Show(hexHash); 
} 

public static byte[] ConvertHexStringToByteArray(string hexString) 
{ 
    if (hexString.Length % 2 != 0) 
    { 
     throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString)); 
    } 

    byte[] HexAsBytes = new byte[hexString.Length/2]; 
    for (int index = 0; index < HexAsBytes.Length; index++) 
    { 
     string byteValue = hexString.Substring(index * 2, 2); 
     HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
    } 

    return HexAsBytes; 
} 
相關問題