Bitcoin Addresses
How they are generated from public keys
(a step-by-step guide)

Ash Moran
aviewfromafar.net
ash@ashleymoran.net
Anatomy of an Address
1kqHKEYYC8CQPxyV53nCju4Lk2ufpQqA2

address

prefix

Base58Check encoding of
the cryptographic hash

of something

(indicated by the prefix)
Step 1:

Representing Numbers
What’s Base58?
Represents numbers (eg decimal, base ten, numbers
using the digits 0-9) using 58 characters
Uses 1-9, most of A-Z and a-z, except:
No letter capital i (I), lowercase L (l), O or 0
Like hexadecimal, but with more digits
What’s hexadecimal?
Represents numbers (eg decimal, base ten, numbers
using the digits 0-9) using 16 characters
Uses 0-9, A-F
A = 10, B = 11, etc
Number -> Hexadecimal
Decimal

Hex

0

0

1

1

2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

10

A

11

B

12

C

13

D

14

E

15

F
Hexadecimal example

C6A =
2 + 6 * 161 + 10 * 160 =
12 * 16
12 * (256) + 6 * (16) + 10 * (1) =
3178
Number -> Base58
Decimal

Base58

Decimal

Base58

Decimal

Base58

0

1

20

M

40

h

1

2

21

N

41

i

2

3

22

P

42

j

3

4

23

Q

43

k

4

5

24

R

44

m

5

6

25

S

45

n

6

7

26

T

46

o

7

8

27

U

47

p

8

9

28

V

48

q

9

A

29

W

49

r

10

B

30

X

50

s

11

C

31

Y

51

t

12

D

32

Z

52

u

13

E

33

a

53

v

14

F

34

b

54

w

15

G

35

c

55

x

16

H

36

d

56

y

17

J

37

e

57

z

18

K

38

f

19

L

39

g
Base58 example

4iX =
2 + 41 * 581 + 30 * 580 =
3 * 58
3 * (3364) + 41 * (58) + 30 * (1) =
12500
Step 2:
Message digests / hashes
Hashing
A hash function takes a value in
eg “This is my message”
Returns a fixed length number out
eg 1129729371291755845
Generates a different number if the input changes even
slightly
“This it my message” => 3763820994290329705
Cryptographic hashing
Like hashing but designed so it’s very very hard to figure out the message from the hash.
hash_function(“This is my message”) => hash_value – EASY!
hash_value => <?what was the message?> – HARD!
Bitcoin uses SHA256 and RIPEMD-160 hash functions
SHA256(“This is my message”) =>

3311b7c0bd91b6c73a38212de8ade31c51910f17480ad212ed2b9798a35b7747
SHA256(“This it my message”) =>
26a9911800b6115eb7ee508f60a2fd6479d45155a8aef1b1a35eb3173a512063
RIPEMD160(“This is my message”) =>

bdb6824f7b28e7dd9b9d6b457142547064435937
Base58 version of a hash
RIPEMD160(“This is my message”) =>

bdb6824f7b28e7dd9b9d6b457142547064435937
hex: 

bdb6824f7b28e7dd9b9d6b457142547064435937 

decimal:
1083069342955023797228115257453753838398332950839
Base58(1083069342955023797228115257453753838398332
950839) =>

3eJ7uPEgX8h56UJmTNmqwTvHs9H8
Step 3:
Bitcoin encryption keys
Public/private key signing

Problem: Alice wants to send Bob a message and
want anybody to be able to verify that the message
came from her. She wants to make sure nobody can
forge her signature on the message.
Elliptic Curve Cryptography

See the excellent guide
A (relatively easy to understand) primer on elliptic curve cryptography
by Nick Sullivan
Elliptic Curve Cryptography
Private key: a random 256-bit (32-byte) integer
Public key: an (x, y) point on the curve, either:
the number 4, followed by 256-bit x and y coordinates
(old uncompressed 65-byte format)

[4, x, y]
the number 2 or 3 followed by a 256-bit x coordinate
(new compressed 33-byte format)

[2, x, y] or [3, x, y]
Step 4:
Checksums
European Article Number

Colgate Total 75 ml
4011200296908
Colgate Total 75ml EAN
checksum
Total of odd numbers = 25

27 + 25 = 52
Last digit of 52 = 2

4 0 1 1 2 0 0 2 9 6 9 0 8
Total of even numbers = 9

9 * 3 = 27

10 - 2 = 8
yay!
Step 5:
Putting it together
Bitcoin pubkey address
Take the pubkey with header byte, e.g. [4, x, y]
Run it through the SHA256 hash function

pubkey_hash_step_1 = SHA256([4, x, y])
Run it through the RIPEMD160 hash function

pubkey_hash = RIPEMD160(pubkey_hash_step_1)
Add a byte to the start to indicate which network it’s for (Bitcoin 00,
Namecoin 34, Bitcoin testnet 6f)

plain_binary_address = [00, pubkey_hash]
TBC…
Checksum generation
Take the plain binary address, and run it through the SHA256 function
twice:

plain_address_hash = SHA256(SHA256(plain_binary_address))
Take the first four bytes of this hash as a checksum:

checksum = first_4_bytes(plain_binary_address)
Add the checksum onto the end to give the binary_address:

binary_address = [00, pubkey_hash, checksum]
Base58 encode the result:

bitcoin_address = Base58(binary_address)
Now we have the result, eg “16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM”
Demo!
(source for live demo now on the next
slide)
Example Ruby source
require 'bitcoin'

!

def hex_string_to_bytes(string)
[string].pack("H*")
end

!

def bytes_to_hex_string(bytes)
bytes.unpack("H*").first
end

!

# https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
private_key_hex_string = "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725"

!

key = Bitcoin::Key.new(private_key_hex_string)
pub_key_bytes = hex_string_to_bytes(key.pub_uncompressed)

!

hash_step_1 = Digest::SHA256.digest(pub_key_bytes)
hash160 = Digest::RMD160.digest(hash_step_1)
hash160_hex_string = bytes_to_hex_string(hash160)

!

versioned_hash160_hex_string = "00" + hash160_hex_string
versioned_hash160 = hex_string_to_bytes(versioned_hash160_hex_string)

!

checksum_hash_round_1 = Digest::SHA256.digest(versioned_hash160)
checksum_hash_round_2 = Digest::SHA256.digest(checksum_hash_round_1)
checksum = checksum_hash_round_2[0,4]

!

binary_address = versioned_hash160 + checksum
binary_address_hex_string = bytes_to_hex_string(binary_address)

!

human_address = Bitcoin.encode_base58(binary_address_hex_string)
p human_address

https://gist.github.com/ashmoran/7582071
Other address types
Other address types
Bitcoin script addresses: 3xxx, e.g.:

3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX
Bitcoin private key (uncompressed pubkey), 5xxx, e.g.:

5Htn3FzuH3b1X5VF2zLTsAQzBcyzkZNJsa2egXN8ZFJ
TCqQm3Rq
Bitcoin private key (compressed pubkey), [K/L]xxx, e.g.:

L1aW4aubDFB7yfras2S1mN3bqg9nwySY8nkoLmJebS
LD5BWv3ENZ
Done!

More Related Content

PPTX
Cryptography
PDF
Bitcoin Keys, Addresses & Wallets
PPTX
Introduction to Solidity and Smart Contract Development (9).pptx
PPTX
Hash Function
PPTX
Intro to modern cryptography
PPTX
Bitcoin developer guide
PPTX
Cryptography
PPTX
Cryptography in Blockchain
Cryptography
Bitcoin Keys, Addresses & Wallets
Introduction to Solidity and Smart Contract Development (9).pptx
Hash Function
Intro to modern cryptography
Bitcoin developer guide
Cryptography
Cryptography in Blockchain

What's hot (20)

PPT
Caesar cipher
PPTX
Information and network security 22 differential cryptanalysis
PDF
Public private key
PPTX
Introduction to Bitcoin's Scripting Language
PPTX
Digital signature(Cryptography)
PPTX
Cryptographic algorithms
PPT
Symmetric & Asymmetric Cryptography
PPTX
Consensus Algorithms - Nakov @ jProfessionals - Jan 2018
PPTX
Data Encryption Standard (DES)
PDF
Introduction to Cryptography
PPTX
Bitcoin (Cryptocurrency)
PDF
Blockchain Training | Blockchain Tutorial for Beginners | Blockchain Technolo...
PDF
Cs8792 cns - unit iv
PDF
Tmc mastering bitcoins ppt
PDF
What is a blockchain?
PPTX
Cryptography
PPTX
Cryptography
PPTX
What is A Smart Contract? | Smart Contracts Tutorial | Smart Contracts in Blo...
Caesar cipher
Information and network security 22 differential cryptanalysis
Public private key
Introduction to Bitcoin's Scripting Language
Digital signature(Cryptography)
Cryptographic algorithms
Symmetric & Asymmetric Cryptography
Consensus Algorithms - Nakov @ jProfessionals - Jan 2018
Data Encryption Standard (DES)
Introduction to Cryptography
Bitcoin (Cryptocurrency)
Blockchain Training | Blockchain Tutorial for Beginners | Blockchain Technolo...
Cs8792 cns - unit iv
Tmc mastering bitcoins ppt
What is a blockchain?
Cryptography
Cryptography
What is A Smart Contract? | Smart Contracts Tutorial | Smart Contracts in Blo...
Ad

Viewers also liked (20)

PDF
Bitcoins Math
PDF
Introduction to Bitcoin
KEY
Introduction to bitcoin
PDF
Bitcoin: The Internet of Money
PDF
Prosumer Report Vida Moderna México
PDF
The Bitcoin Protocol for Humans
PDF
A2Apay Domestic Cross Border Payment Flow
PPTX
How to demystify cross-border payments in travel
PDF
Bitcoin Level 2
PPTX
Cross Border Payment- India and New 15CA/15CB Requirements
PDF
Peer_to_Peer_Affine_Commitment
PPTX
Banking presentation
PDF
General Introduction to Bitcoin
PDF
FedLink Wire Transfer System
PPTX
Logistics II Western Union & DHL
PPT
BANK Automated Clearing System
PPTX
Payments and transaction processing systems - Global and Indian Overview
PPTX
RTGS REAL TIME GROSS SETTLEMENT
PDF
An introduction to SwiftNET
Bitcoins Math
Introduction to Bitcoin
Introduction to bitcoin
Bitcoin: The Internet of Money
Prosumer Report Vida Moderna México
The Bitcoin Protocol for Humans
A2Apay Domestic Cross Border Payment Flow
How to demystify cross-border payments in travel
Bitcoin Level 2
Cross Border Payment- India and New 15CA/15CB Requirements
Peer_to_Peer_Affine_Commitment
Banking presentation
General Introduction to Bitcoin
FedLink Wire Transfer System
Logistics II Western Union & DHL
BANK Automated Clearing System
Payments and transaction processing systems - Global and Indian Overview
RTGS REAL TIME GROSS SETTLEMENT
An introduction to SwiftNET
Ad

Similar to Bitcoin Addresses (20)

PPTX
J.burke HackMiami6
PPTX
Blockchain Cryptography for Developers (Nakov @ BlockWorld 2018, San Jose)
PPTX
Blockchain Cryptography for Developers (Nakov @ BGWebSummit 2018)
PPTX
Cryptography in a use case of Blockchain.pptx
PDF
Blockchain 101 - Introduction for Developers
PDF
Blockchain and Cryptography - A Primer
ODP
Bitclamp - A Permanent and Anonymous Publishing Platform Over Bitcoin
PPTX
Blockchain and Bitcoin
PPTX
Bitcoin and it's security related to transaction.pptx
PDF
Wallet from noob to pro
PPTX
Bitcoin I.pptx
PPTX
SMART Seminar Series: "Blockchain and its Applications". Presented by Prof Wi...
PPTX
Build your own block chain
PDF
Bitcoin and Blockchain 101
PPTX
以比特幣為例的區塊鏈技術介紹 ( Intro to Blockchain using Bitcoin as an example)
PPTX
BitCoin Protocol
PDF
Topic 2 Blockchain Fundamentals - Cryptography BW.pdf
PDF
Bitcoins: Application of blockchain technology
PDF
Bitcoin.pdf
PPTX
chapter4.pptxwgdyjshcbnbhvegwydvquhcjdvqigufwk
J.burke HackMiami6
Blockchain Cryptography for Developers (Nakov @ BlockWorld 2018, San Jose)
Blockchain Cryptography for Developers (Nakov @ BGWebSummit 2018)
Cryptography in a use case of Blockchain.pptx
Blockchain 101 - Introduction for Developers
Blockchain and Cryptography - A Primer
Bitclamp - A Permanent and Anonymous Publishing Platform Over Bitcoin
Blockchain and Bitcoin
Bitcoin and it's security related to transaction.pptx
Wallet from noob to pro
Bitcoin I.pptx
SMART Seminar Series: "Blockchain and its Applications". Presented by Prof Wi...
Build your own block chain
Bitcoin and Blockchain 101
以比特幣為例的區塊鏈技術介紹 ( Intro to Blockchain using Bitcoin as an example)
BitCoin Protocol
Topic 2 Blockchain Fundamentals - Cryptography BW.pdf
Bitcoins: Application of blockchain technology
Bitcoin.pdf
chapter4.pptxwgdyjshcbnbhvegwydvquhcjdvqigufwk

Recently uploaded (20)

PDF
Accessing-Finance-in-Jordan-MENA 2024 2025.pdf
PDF
Flame analysis and combustion estimation using large language and vision assi...
PDF
Credit Without Borders: AI and Financial Inclusion in Bangladesh
PDF
Consumable AI The What, Why & How for Small Teams.pdf
PDF
“A New Era of 3D Sensing: Transforming Industries and Creating Opportunities,...
PPTX
Custom Battery Pack Design Considerations for Performance and Safety
PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
PDF
UiPath Agentic Automation session 1: RPA to Agents
PDF
Enhancing plagiarism detection using data pre-processing and machine learning...
PPTX
Build Your First AI Agent with UiPath.pptx
PDF
Taming the Chaos: How to Turn Unstructured Data into Decisions
PDF
STKI Israel Market Study 2025 version august
PDF
How ambidextrous entrepreneurial leaders react to the artificial intelligence...
PPTX
Module 1 Introduction to Web Programming .pptx
PDF
Transform-Quality-Engineering-with-AI-A-60-Day-Blueprint-for-Digital-Success.pdf
PDF
CXOs-Are-you-still-doing-manual-DevOps-in-the-age-of-AI.pdf
PDF
Transform-Your-Supply-Chain-with-AI-Driven-Quality-Engineering.pdf
PDF
sbt 2.0: go big (Scala Days 2025 edition)
PDF
NewMind AI Weekly Chronicles – August ’25 Week IV
PDF
NewMind AI Weekly Chronicles – August ’25 Week III
Accessing-Finance-in-Jordan-MENA 2024 2025.pdf
Flame analysis and combustion estimation using large language and vision assi...
Credit Without Borders: AI and Financial Inclusion in Bangladesh
Consumable AI The What, Why & How for Small Teams.pdf
“A New Era of 3D Sensing: Transforming Industries and Creating Opportunities,...
Custom Battery Pack Design Considerations for Performance and Safety
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
UiPath Agentic Automation session 1: RPA to Agents
Enhancing plagiarism detection using data pre-processing and machine learning...
Build Your First AI Agent with UiPath.pptx
Taming the Chaos: How to Turn Unstructured Data into Decisions
STKI Israel Market Study 2025 version august
How ambidextrous entrepreneurial leaders react to the artificial intelligence...
Module 1 Introduction to Web Programming .pptx
Transform-Quality-Engineering-with-AI-A-60-Day-Blueprint-for-Digital-Success.pdf
CXOs-Are-you-still-doing-manual-DevOps-in-the-age-of-AI.pdf
Transform-Your-Supply-Chain-with-AI-Driven-Quality-Engineering.pdf
sbt 2.0: go big (Scala Days 2025 edition)
NewMind AI Weekly Chronicles – August ’25 Week IV
NewMind AI Weekly Chronicles – August ’25 Week III

Bitcoin Addresses

  • 1. Bitcoin Addresses How they are generated from public keys (a step-by-step guide) Ash Moran aviewfromafar.net [email protected]
  • 2. Anatomy of an Address 1kqHKEYYC8CQPxyV53nCju4Lk2ufpQqA2 address
 prefix Base58Check encoding of the cryptographic hash
 of something
 (indicated by the prefix)
  • 4. What’s Base58? Represents numbers (eg decimal, base ten, numbers using the digits 0-9) using 58 characters Uses 1-9, most of A-Z and a-z, except: No letter capital i (I), lowercase L (l), O or 0 Like hexadecimal, but with more digits
  • 5. What’s hexadecimal? Represents numbers (eg decimal, base ten, numbers using the digits 0-9) using 16 characters Uses 0-9, A-F A = 10, B = 11, etc
  • 7. Hexadecimal example C6A = 2 + 6 * 161 + 10 * 160 = 12 * 16 12 * (256) + 6 * (16) + 10 * (1) = 3178
  • 9. Base58 example 4iX = 2 + 41 * 581 + 30 * 580 = 3 * 58 3 * (3364) + 41 * (58) + 30 * (1) = 12500
  • 11. Hashing A hash function takes a value in eg “This is my message” Returns a fixed length number out eg 1129729371291755845 Generates a different number if the input changes even slightly “This it my message” => 3763820994290329705
  • 12. Cryptographic hashing Like hashing but designed so it’s very very hard to figure out the message from the hash. hash_function(“This is my message”) => hash_value – EASY! hash_value => <?what was the message?> – HARD! Bitcoin uses SHA256 and RIPEMD-160 hash functions SHA256(“This is my message”) =>
 3311b7c0bd91b6c73a38212de8ade31c51910f17480ad212ed2b9798a35b7747 SHA256(“This it my message”) => 26a9911800b6115eb7ee508f60a2fd6479d45155a8aef1b1a35eb3173a512063 RIPEMD160(“This is my message”) =>
 bdb6824f7b28e7dd9b9d6b457142547064435937
  • 13. Base58 version of a hash RIPEMD160(“This is my message”) =>
 bdb6824f7b28e7dd9b9d6b457142547064435937 hex: 
 bdb6824f7b28e7dd9b9d6b457142547064435937 
 decimal: 1083069342955023797228115257453753838398332950839 Base58(1083069342955023797228115257453753838398332 950839) =>
 3eJ7uPEgX8h56UJmTNmqwTvHs9H8
  • 15. Public/private key signing Problem: Alice wants to send Bob a message and want anybody to be able to verify that the message came from her. She wants to make sure nobody can forge her signature on the message.
  • 16. Elliptic Curve Cryptography See the excellent guide A (relatively easy to understand) primer on elliptic curve cryptography by Nick Sullivan
  • 17. Elliptic Curve Cryptography Private key: a random 256-bit (32-byte) integer Public key: an (x, y) point on the curve, either: the number 4, followed by 256-bit x and y coordinates (old uncompressed 65-byte format)
 [4, x, y] the number 2 or 3 followed by a 256-bit x coordinate (new compressed 33-byte format)
 [2, x, y] or [3, x, y]
  • 19. European Article Number Colgate Total 75 ml 4011200296908
  • 20. Colgate Total 75ml EAN checksum Total of odd numbers = 25 27 + 25 = 52 Last digit of 52 = 2 4 0 1 1 2 0 0 2 9 6 9 0 8 Total of even numbers = 9
 9 * 3 = 27 10 - 2 = 8 yay!
  • 21. Step 5: Putting it together
  • 22. Bitcoin pubkey address Take the pubkey with header byte, e.g. [4, x, y] Run it through the SHA256 hash function
 pubkey_hash_step_1 = SHA256([4, x, y]) Run it through the RIPEMD160 hash function
 pubkey_hash = RIPEMD160(pubkey_hash_step_1) Add a byte to the start to indicate which network it’s for (Bitcoin 00, Namecoin 34, Bitcoin testnet 6f)
 plain_binary_address = [00, pubkey_hash] TBC…
  • 23. Checksum generation Take the plain binary address, and run it through the SHA256 function twice:
 plain_address_hash = SHA256(SHA256(plain_binary_address)) Take the first four bytes of this hash as a checksum:
 checksum = first_4_bytes(plain_binary_address) Add the checksum onto the end to give the binary_address:
 binary_address = [00, pubkey_hash, checksum] Base58 encode the result:
 bitcoin_address = Base58(binary_address) Now we have the result, eg “16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM”
  • 24. Demo! (source for live demo now on the next slide)
  • 25. Example Ruby source require 'bitcoin' ! def hex_string_to_bytes(string) [string].pack("H*") end ! def bytes_to_hex_string(bytes) bytes.unpack("H*").first end ! # https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses private_key_hex_string = "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725" ! key = Bitcoin::Key.new(private_key_hex_string) pub_key_bytes = hex_string_to_bytes(key.pub_uncompressed) ! hash_step_1 = Digest::SHA256.digest(pub_key_bytes) hash160 = Digest::RMD160.digest(hash_step_1) hash160_hex_string = bytes_to_hex_string(hash160) ! versioned_hash160_hex_string = "00" + hash160_hex_string versioned_hash160 = hex_string_to_bytes(versioned_hash160_hex_string) ! checksum_hash_round_1 = Digest::SHA256.digest(versioned_hash160) checksum_hash_round_2 = Digest::SHA256.digest(checksum_hash_round_1) checksum = checksum_hash_round_2[0,4] ! binary_address = versioned_hash160 + checksum binary_address_hex_string = bytes_to_hex_string(binary_address) ! human_address = Bitcoin.encode_base58(binary_address_hex_string) p human_address https://gist.github.com/ashmoran/7582071
  • 27. Other address types Bitcoin script addresses: 3xxx, e.g.:
 3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX Bitcoin private key (uncompressed pubkey), 5xxx, e.g.:
 5Htn3FzuH3b1X5VF2zLTsAQzBcyzkZNJsa2egXN8ZFJ TCqQm3Rq Bitcoin private key (compressed pubkey), [K/L]xxx, e.g.:
 L1aW4aubDFB7yfras2S1mN3bqg9nwySY8nkoLmJebS LD5BWv3ENZ
  • 28. Done!