以字節形式獲取 PublicKey 的正確 SHA256
我是程式碼開發的新手,自從一年 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 <= 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 <> 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 <= 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 <= 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 也是如此。