Bitcoin Forum
June 14, 2024, 08:29:50 PM *
News: Voting for pizza day contest
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: How to generate the hash of public key in Bitcoin  (Read 155 times)
PrettyGirl741963 (OP)
Newbie
*
Offline Offline

Activity: 7
Merit: 10


View Profile
February 24, 2020, 08:14:35 AM
Last edit: February 24, 2020, 02:16:08 PM by PrettyGirl741963
Merited by Quickseller (1)
 #1

I'm trying to hash the public key with SHA256 and then ripemed160 and get the hash. but it gives the error "System.ArgumentOutOfRangeException: 'Index and length must refer to a location within the string. Parameter name: length'" I think it's because of the odd number of characters of the public key.

Public key: 2b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737

Hash should be: 93ce48570b55c42c2af816aeaba06cfee1224fae

Code:
Imports System.Security.Cryptography
Imports System.Text
Imports System.Globalization
Imports System.Numerics

Private Function HexStringToByteArray(ByVal shex As String) As Byte()
    Dim B As Byte() = Enumerable.Range(0, shex.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(shex.Substring(x, 2), 16)).ToArray()
    Return Enumerable.Range(0, shex.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(shex.Substring(x, 2), 16)).ToArray()
End Function


Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click

Dim public_key as String = "2b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737"
   Dim pubkey_hash As String

    Dim sha256 As SHA256 = SHA256Managed.Create()
      Dim bytes As Byte() = HexStringToByteArray(public_key)
    Dim hash As Byte() = sha256.ComputeHash(bytes)
    Dim stringBuilder1 As New StringBuilder()

    For i As Integer = 0 To hash.Length - 1
        stringBuilder1.Append(hash(i).ToString("X2"))
    Next

    bytes = HexStringToByteArray(stringBuilder1.ToString())

    Dim ripemd160 As RIPEMD160 = RIPEMD160Managed.Create()
    Dim hash_160 As Byte() = ripemd160.ComputeHash(bytes)

    Dim stringBuilder2 As New StringBuilder()

    For i As Integer = 0 To hash_160.Length - 1
        stringBuilder2.Append(hash_160(i).ToString("X2"))
    Next

    Dim arr() As Char = stringBuilder2.ToString

    pubkey_hash = arr.tostring
    TextBox14.Text = pubkey_hash


   End Sub


what I want to achieve is : bitcoin Public key --> SHA256 --> RIPEMD160 = final hash
pooya87
Legendary
*
Offline Offline

Activity: 3486
Merit: 10641



View Profile
February 24, 2020, 08:26:19 AM
 #2

Quote
Code:
Dim public_key as String = "2b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737"
Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(public_key)

your "public_key" variable is a hexadecimal string not a Unicode string and that means your initial byte array that you hash is the wrong value.
you already have a function called "HexStringToByteArray", i'm not sure if it is a correct conversion but if it is then use that instead of "System.Text.Encoding.Unicode.GetBytes"

.
.BLACKJACK ♠ FUN.
█████████
██████████████
████████████
█████████████████
████████████████▄▄
░█████████████▀░▀▀
██████████████████
░██████████████
████████████████
░██████████████
████████████
███████████████░██
██████████
CRYPTO CASINO &
SPORTS BETTING
▄▄███████▄▄
▄███████████████▄
███████████████████
█████████████████████
███████████████████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████████████
█████████████████████
███████████████████
▀███████████████▀
█████████
.
PrettyGirl741963 (OP)
Newbie
*
Offline Offline

Activity: 7
Merit: 10


View Profile
February 24, 2020, 08:53:09 AM
 #3

Public keys are not hexadecimal, this is an actual bitcoin public address :
Quote
mwZVuA4D5TSSymdXZza4S1YhZFnH2fcaeG
  see it's not a hexadecimal
pooya87
Legendary
*
Offline Offline

Activity: 3486
Merit: 10641



View Profile
February 24, 2020, 09:16:18 AM
Merited by Quickseller (2), Heisenberg_Hunter (1)
 #4

Public keys are not hexadecimal, this is an actual bitcoin public address :
Quote
mwZVuA4D5TSSymdXZza4S1YhZFnH2fcaeG
  see it's not a hexadecimal

there is a difference between "public key" and an "address" or if you like public address. public key is an x,y coordinate of a point located on the elliptic curve while address is a base58 encoding of hash of the public key.
what you posted here is a testnet address and it is using base58 encoding. (you still should use Unicode to decode this)

however public keys are usually presented in base-16 or hexadecimal format. additionally in your code the variable called public_key is indeed a public key and is indeed using hexadecimal encoding.

.
.BLACKJACK ♠ FUN.
█████████
██████████████
████████████
█████████████████
████████████████▄▄
░█████████████▀░▀▀
██████████████████
░██████████████
████████████████
░██████████████
████████████
███████████████░██
██████████
CRYPTO CASINO &
SPORTS BETTING
▄▄███████▄▄
▄███████████████▄
███████████████████
█████████████████████
███████████████████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████████████
█████████████████████
███████████████████
▀███████████████▀
█████████
.
PrettyGirl741963 (OP)
Newbie
*
Offline Offline

Activity: 7
Merit: 10


View Profile
February 24, 2020, 10:06:09 AM
 #5

Public keys are not hexadecimal, this is an actual bitcoin public address :
Quote
mwZVuA4D5TSSymdXZza4S1YhZFnH2fcaeG
 see it's not a hexadecimal

there is a difference between "public key" and an "address" or if you like public address. public key is an x,y coordinate of a point located on the elliptic curve while address is a base58 encoding of hash of the public key.
what you posted here is a testnet address and it is using base58 encoding. (you still should use Unicode to decode this)

however public keys are usually presented in base-16 or hexadecimal format. additionally in your code the variable called public_key is indeed a public key and is indeed using hexadecimal encoding.

Thank you for the explanation I didn't know that, but I changed the code to convert it to byte array from hex string. then it gives me this error. I think it's because of the odd number of characters of the public key
Quote
System.ArgumentOutOfRangeException: 'Index and length must refer to a location within the string.
Parameter name: length'

PrettyGirl741963 (OP)
Newbie
*
Offline Offline

Activity: 7
Merit: 10


View Profile
February 25, 2020, 05:02:28 AM
 #6

updated with code, now gets an error
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!