比特币 sha256 到十六进制生成与预期不同的结果
Bitcoin sha256 to hex generates different result than expected
我正在尝试按照有关从中导出十六进制比特币私钥的 WIF 的说明进行操作 - https://en.bitcoin.it/wiki/Wallet_import_format
但是,当我尝试对字符串(包括 0x80 字节)进行哈希处理时,我得到的结果与预期的不同。
我应该得到 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592。
相反,我收到 e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09.
我广泛阅读了 google 并且我明白我应该将字符串转换为二进制文件。我这样做了,然后将这些二进制文件中的 char 数组散列为相同的结果。
由于@Heinan Cabouly 和@JaredPar
,代码现在可以正常工作了
这是工作代码:
using System;
using System.Security.Cryptography;
using System.Text;
using System.Linq;
namespace Base58Encode
{
internal class Program
{
public static string Str = "800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D";
public static byte[] Bytes;
public static void Main()
{
Bytes = StringToByteArray(Str);
SHA256Managed sha = new SHA256Managed();
string hashstr = String.Empty;
byte[] encrypt = sha.ComputeHash(Bytes);
foreach (byte b in encrypt)
{
hashstr += b.ToString("x2");
}
Console.WriteLine(hashstr);
//prints e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09
//instead of 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
Console.ReadLine();
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
}
}
这是在 C# 中对十六进制字符串 SHA-256 进行哈希处理的方法。
谢谢大家!帮了我大忙!
如前所述,您用于转换的方法不合适。您可以使用此方法(由@JaredPar 从 Whosebug 获取):
public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
您使用 str(表示 HEX 字符串)调用此函数,它将 return HEX 表示形式。
从那里,您可以继续编写您的功能。
我正在尝试按照有关从中导出十六进制比特币私钥的 WIF 的说明进行操作 - https://en.bitcoin.it/wiki/Wallet_import_format 但是,当我尝试对字符串(包括 0x80 字节)进行哈希处理时,我得到的结果与预期的不同。 我应该得到 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592。 相反,我收到 e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09.
我广泛阅读了 google 并且我明白我应该将字符串转换为二进制文件。我这样做了,然后将这些二进制文件中的 char 数组散列为相同的结果。
由于@Heinan Cabouly 和@JaredPar
,代码现在可以正常工作了这是工作代码:
using System;
using System.Security.Cryptography;
using System.Text;
using System.Linq;
namespace Base58Encode
{
internal class Program
{
public static string Str = "800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D";
public static byte[] Bytes;
public static void Main()
{
Bytes = StringToByteArray(Str);
SHA256Managed sha = new SHA256Managed();
string hashstr = String.Empty;
byte[] encrypt = sha.ComputeHash(Bytes);
foreach (byte b in encrypt)
{
hashstr += b.ToString("x2");
}
Console.WriteLine(hashstr);
//prints e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09
//instead of 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
Console.ReadLine();
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
}
}
这是在 C# 中对十六进制字符串 SHA-256 进行哈希处理的方法。 谢谢大家!帮了我大忙!
如前所述,您用于转换的方法不合适。您可以使用此方法(由@JaredPar 从 Whosebug 获取):
public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
您使用 str(表示 HEX 字符串)调用此函数,它将 return HEX 表示形式。
从那里,您可以继续编写您的功能。