从 C# 中的十六进制/二进制字符串计算 SHA1

本文关键字:二进制 字符串 计算 SHA1 十六进制 | 更新日期: 2023-09-27 18:31:31

经过24小时的编程,我终于破解了,我想制作一个C# WindowsForm应用程序,向您显示哈希十六进制输入的值,就像在hashcalc中一样。即使在谷歌搜索之后,我也只能为文本字符串输入制作它。为了演示,输入060201080808040602040909080909003583150369840500应输出 d8f6b336a4df3336bf7de58a38b1189f6c5ce1e8而不是 a6879cb4510b18e8f41b3491ce474fd2ff9e2979这也是针对 SHA1 哈希的,所以只保留它,谢谢!

从 C# 中的十六进制/二进制字符串计算 SHA1

对于这个090505050509050009080003000605003569190380108300我有3b8d562adb792985a7393a6ab228aa6e7526410a,不是3b8d562adb792985a7393a6ab228aa6e752641a

我认为最后一个字节是错误的。

我想我真的不明白你的问题。您可以对任何输入进行哈希处理,并以您想要的任何方式输出它。为此,您可以将 Encoding 类与您选择的编码一起使用,并调用 GetBytes() 方法。然后你采用 SHA1 类并让它计算哈希值。对于用户文本,您告诉字符串类对数字使用十六进制格式。这不仅适用于 SHA1 类;)

您需要导入命名空间:

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

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;
}