2013-09-16 38 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; 
} 
相关问题