Sha256

以字節形式獲取 PublicKey 的正確 SHA256

  • December 10, 2019

我是程式碼開發的新手,自從一年 VB.NET 以來,我一直在自己研究它(書籍、教程、網站的官方幫助……)。我讀到的很多資訊都是用 C# 編寫的,我用 VB.NET 重寫了這些資訊。四個月前我開始閱讀和編寫一些關於 SHA256、Aes、ECDsa 的程式碼……隨著時間和實踐,我理解了一些東西,但還有一些東西我在閱讀之前無法理解(或找到)很多資訊。好吧,在這種情況下,我想我可以理解,但我不知道如何編寫程式碼或了解 SHA256 的工作原理。我正在遵循以下說明:

<http://gobittest.appspot.com/Address>

ripemd160(sha256(publickey)) - 我哪裡出錯了? << 我想我也有同樣的問題。

我將嘗試具體化並為其他人編寫所有必要的程式碼,這可能是為了他們的利益。感謝您提前為我提供的所有幫助、連結和資訊,讓我走上正確的道路。好吧,這就是我的情況:我已經創建了一個公鑰(x 座標和 y 座標)和一個由 ECDsa 使用 SecP256k1 曲線的私鑰。這是程式碼:

Private Sub GetKeys()
Using myECDsa As New System.Security.Cryptography.ECDsaCng(vCurve)
myECDsa.HashAlgorithm = CngAlgorithm.Sha256
Dim PrivateKey() As Byte = myECDsa.Key.Export(CngKeyBlobFormat.EccPrivateBlob)
Dim PublicKey() As Byte = myECDsa.Key.Export(CngKeyBlobFormat.EccPublicBlob)

Console.WriteLine(Convert.ToBase64String(PrivateKey))
Console.WriteLine(Convert.ToBase64String(PublicKey))
End Using
End Sub

*vCurve 是一個包含字元串“SecP256k1”的變數

輸出可能是這樣的:

Private Key: RUNEViAAAADvJ2dk9gUnYF2XDIr5dNITLUXnXJRgXD8A3WHeDe6YkBBTJAlNizJCp5rMG0163U2JfNWEnBKEE7AjU2guVar63+jTifUg8/UrjTfoLkoIgdk8VLnTz1HYDxEvR2GtE70=
Public Key: RUNEUCAAAADvJ2dk9gUnYF2XDIr5dNITLUXnXJRgXD8A3WHeDe6YkBBTJAlNizJCp5rMG0163U2JfNWEnBKEE7AjU2guVar6

如果我將此程式碼寫入Using,我可以轉換為字元串和乾淨的數據

'Private Key
Dim StrPrivateKey As String = String.Empty
For Each bt As Byte In PrivateKey
StrPrivateKey &= bt.ToString("X2")
Next
'Public Key
Dim StrPublicKey As String = String.Empty
For Each bt As Byte In PublicKey
StrPublicKey &= bt.ToString("X2")
Next
Dim StrDigits As String = StrPrivateKey.Substring(0, 16)
'Clean data
StrPrivateKey = StrPrivateKey.Substring(StrPublicKey.Length)
StrPublicKey = StrPublicKey.Substring(16)
Dim StrXCoord As String = StrPublicKey.Substring(0, 64)
Dim StrYCoord As String = StrPublicKey.Substring(64)

輸出是:

Private Key: 6624B7D42BA98F09B4782B755DEE4A050A3E5F15D1DFB152E5A0571ABD045797
Public Key: C400BED535B984BADCB6DA96D4167709314085B6E5405C7CE1A3D2CF76FA991DC34F2FAA9533FEFD80E6EAA20ED0BD2D7A30F2696A08570B053159FA7068CE90
Digits: 4543445620000000
Xcoord: C400BED535B984BADCB6DA96D4167709314085B6E5405C7CE1A3D2CF76FA991D
YCoord: C34F2FAA9533FEFD80E6EAA20ED0BD2D7A30F2696A08570B053159FA7068CE90

第一個問題: 我看到每個私鑰/公鑰都有相似的數字或 8 個字節。在這個例子中是:4543445620000000

這個數字是多少?它是某種東西的版本嗎?

第二個問題: 我找到了一些關於如何獲取公鑰的 SHA256 的資訊。如果我得到這個例子的 SHA256,結果是:

Public Key: 04C400BED535B984BADCB6DA96D4167709314085B6E5405C7CE1A3D2CF76FA991DC34F2FAA9533FEFD80E6EAA20ED0BD2D7A30F2696A08570B053159FA7068CE90
SHA256: f7beda57bd9e0c9838dd4e1336aaa363c2bfa88eca25407b472a620fcaa1626f

如果我將公鑰作為字元串,則 Sha256 是正確的(是的,我在開頭寫了“04”,我知道這不是一個字節)。但是我讀過公鑰必須以字節為單位,這是我迷路的部分。我有 PublicKey() 作為字節,但我不知道如何使用它來獲得 SHA256。所有 sha256 教程和有關它的幫助,散列單個字元串或文件,如您所見,我需要一些我不知道如何搜尋的資訊。

非常感謝。

‘——– 編輯以編寫我如何使用 SHA256 程式碼。我正在閱讀以學習的很多資訊來自<https://docs.microsoft.com>

Public Function FxSHA256(ByVal textHashed As String) As String
       If textHashed.Length &lt;= 0 Then
           MsgBox("No text to hash.")
           Return 0
           Exit Function
       End If
       Dim hash As String = String.Empty
       Using mySHA256 As SHA256 = SHA256.Create()
           hash = ModuleConvert.GetHASH(mySHA256, textHashed)
       End Using
       myHash256 = hash
       Return hash
   End Function

在其他模組中,我有這個:

'HashAlgorythm
Public Function GetHASH(ByVal hashAlgorithm As HashAlgorithm, ByVal textHashed As String) As String
   Dim data As Byte() = hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(textHashed))
   Dim sBuilder As New StringBuilder()
   For i As Integer = 0 To data.Length - 1
       sBuilder.Append(data(i).ToString("x2"))
   Next
   Return sBuilder.ToString()
End Function

好吧,我迷失在散列字節中。最後,這個網站幫助我了解了發生的事情:https ://jackdye.co.uk/generating-a-bitcoin-address-in-c/

在我的文章中,我正在對字元串進行雜湊處理,這就是為什麼 SHA256 永遠無法正常工作的原因。我們可以在螢幕上將這些值顯示為字元串,但是當我們必須執行 SHA256 或 RIPEMD160 時,我們需要字節(很多人有或遇到過這個問題,以了解如何添加字節並將它們作為字節而不是字元串進行散列。這是一個理解問題)。要將字元串轉換為字節,我使用此函式:

Public Function HexToByteArray(ByVal HexString As String) As Byte()
   Dim ByteArray((HexString.Length / 2) - 1) As Byte
   If HexString.Length Mod 2 &lt;&gt; 0 Then
       MsgBox("Invalid Hex string.")
   Else
       For i As Integer = 0 To ByteArray.Length - 1
           ReDim Preserve ByteArray(i)
           ByteArray(i) = Byte.Parse(HexString.Substring(i * 2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture)
       Next
   End If
   Return ByteArray
End Function

好的,讓我們開始吧: 使用字元串並轉換為 byte():

當以字元串形式獲取公鑰時,添加一個字節:

Dim myString as String = "04" & "C400BED535B984BADCB6DA96D4167709314085B6E5405C7CE1A3D2CF76FA991DC34F2FAA9533FEFD80E6EAA20ED0BD2D7A30F2696A08570B053159FA7068CE90"

是的,這仍然是一個字元串,我們正在添加一個字元串“04”,但我們將轉換為一個字節。現在將其作為字節散列:這是用於字節的 SHA256 的函式

Public Function FxSHA256(ByVal ByteArray() As Byte) As Byte()
If ByteArray.Length &lt;= 0 Then
MsgBox("No Byte Array to Hash.")
Return ByteArray
Exit Function
End If
Using NewSHA256 As SHA256 = SHA256.Create()
Return NewSHA256.ComputeHash(ByteArray)
End Using
End Function

這是字元串的 SHA256 函式(在此範例中獲取正確 SHA256 的函式錯誤)

Public Function FxSHA256(ByVal textHashed As String) As String
If textHashed.Length &lt;= 0 Then
MsgBox("No text to hash.")
Return 0
Exit Function
End If
Dim hash As String = String.Empty
Using mySHA256 As SHA256 = SHA256.Create()
hash = ModuleConvert.GetHASH(mySHA256, textHashed)
End Using
myHash256 = hash
Return hash
End Function

現在,您可以理解為什麼我得到正確的 SHA256 以及為什麼我會迷失、錯誤和困惑。

要以字節為單位正確散列字元串:

FxSHA256(HexToByteArray(myString))

如果你想在螢幕上顯示,你可以這樣做:

For Each bt As Byte In FxSHA256(HexToByteArray(myString))
Console.Write(bt.ToString("x2"))
Next

RIPEMD160 也是如此。

引用自:https://bitcoin.stackexchange.com/questions/91263