2017-04-13 3 views
0

16 진수 비트 코인 개인 키의 WIF를 유도하는 지침을 따르려고합니다. - https://en.bitcoin.it/wiki/Wallet_import_format 그러나 문자열 (0x80 바이트 포함)을 해시하려고하면 다른 결과를 얻습니다 결과가 예상보다 큼. 나는 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592를 얻어야했다. 대신 e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09가 나타납니다.Bitcoin sha256이 예상보다 다른 결과를 생성 함

Google에서 광범위하게 읽었으며 문자열을 바이너리로 변환해야한다는 것을 이해했습니다. 나는 그 바이너리로부터 char 배열을 같은 결과로 해쉬했다.

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#에서 16 진수 문자열 SHA-256 해시하는 방법입니다 :

코드가 지금 여기에 @Heinan Cabouly 및 @JaredPar

을 감사 작동하면 작동 코드입니다. 감사합니다. 나를 많이 도와 줬어!

+1

byte [] ba = Encoding.ASCII.GetBytes (Str);'- 문자열을 16 진수로 파싱하지 않는다는 것을 알고 있습니까? ASCII 인코딩을 사용하여 문자열을 바이트로 변환하기 때문에 문자 당 1 바이트가됩니다. Stack overflow에서 "parse hex string to bytes C#"를 검색하십시오 ... –

+0

고마워, 알아 냈어. :) – user3410566

답변

1

앞서 언급했듯이 변환을 위해 사용한 방법은 적합하지 않습니다. 당신은 (@JaredPar에 의해 유래에서 가져온)이 방법을 사용할 수 있습니다

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

당신은 (16 진수 문자열을 나타냅니다) 당신의 STR이 함수를 호출을, 그리고 16 진수 표현을 반환합니다.

거기에서 작성한대로 계속 기능을 사용할 수 있습니다.

+0

고마워요! 그랬어! :) – user3410566

관련 문제