【问题标题】:Bitcoin sha256 to hex generates different result than expected比特币 sha256 到十六进制产生的结果与预期不同
【发布时间】:2017-09-09 03:41:19
【问题描述】:

我正在尝试按照说明从 -https://en.bitcoin.it/wiki/Wallet_import_format 获取 Hex 比特币私钥的 WIF 但是,当我尝试对字符串(包括 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 的方法。 谢谢大家!帮了我很多忙!

【问题讨论】:

  • byte[] ba = Encoding.ASCII.GetBytes(Str); - 你确实意识到这不是将字符串解析为十六进制,对吧?它只是使用 ASCII 编码将字符串转换为字节,因此每个字符一个字节。在 Stack Overflow 上搜索“将十六进制字符串解析为字节 c#”...
  • 谢谢,我想通了。 :)

标签: c# arrays string sha256 bitcoin


【解决方案1】:

正如我之前所说,您用于转换的方法不合适。您可以使用此方法(@JaredPar 取自 stackoverflow):

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(代表十六进制字符串)调用这个函数,它会返回十六进制表示。

从那里,您可以继续编写函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多