Shellsec

Fuld version: Bitcoin addresse-generator
Du ser lige nu en skrabet udgave af vores indhold. Se den fulde version med ordentlig formatering.
I forbindelse med et lille projekt jeg arbejder på, har jeg produceret lidt kode i min python-sandkasse for bedre at forstå konceptet.
Måske vil i andre også finde det interessant at vide hvordan bitcoin addresser genereres?

Jeg har med vilje delt koden så meget op som muligt, for at gøre fremgangsmåden HELT tydelig, da jeg skal igennem samme proces i et andet sprog på et senere tidspunkt, og tænkte at jeg kunne formulere mig så i andre også kunne lære noget :)

Programmet tager ingen parametre og kræver python 2.x for at fungere.

"""
Bitcoin addresse-generator
Lavet af Doctor Blue (2013)

DEPENDENCIES:
- ecdsa (Elliptical Curve Digital Signature Algorithm)
- base58

Begge libraries kan hentes vha. pip

NOTE:
Koden er ekstremt redundant (og usikker) og udelukkende produceret
for at give en bedre forståelse for hvordan addresser genereres.
"""

from ecdsa import ecdsa
from ecdsa.curves import SECP256k1
from ecdsa import ellipticcurve
from ecdsa import SigningKey
import random
import hashlib
import base58

# Generer en offentlig og en privat nøgle baseret på SECP256k1 kurven
sk = SigningKey.generate(SECP256k1)
vk = sk.get_verifying_key()

# Tilføj 0x04 til den offentlige nøgle og konverter strengen til en binær værdi
pubkey = ("04" + vk.to_string().encode("hex")).decode("hex")

# Hash nøglen med SHA-256 og output i binær
pubkey_sha = hashlib.sha256(pubkey).digest()

# Hash nøglen med RIPEMD-160 og output i hex
ripe = hashlib.new("ripemd160")
ripe.update(pubkey_sha)
pubkey_ripe = ripe.hexdigest()

# Tilføj 0x00 foran (Bitcoin version) og konverter til binær
pubkey_ripe_bin = ("00" + pubkey_ripe).decode("hex")

"""
Følgende del med checksums kan også gøres på følgende måde:
address_base58 = b58encode_check(pubkey_ripe_bin)
og er udelukkende beskrevet for at vise hvordan checksummen beregnes
"""

# Hash med SHA-256 og output til binær
pubkey_sha2 = hashlib.sha256(pubkey_ripe).digest()

# Hash med SHA-256 igen og output til hex
pubkey_sha3 = hashlib.sha256(pubkey_sha2).hexdigest()

# Gem de sidste 4 bytes (8 tegn), da de kan bruges til at tjekke addressens integritet
checksum = pubkey_sha3[:8]

# Sæt checksummen på sidst i addressen og konverter til binær
address_binary = (pubkey_ripe + checksum).decode("hex")

# Konverter til base58 - Dette er den færdige addresse
address_base58 = base58.b58encode(address_binary)

# Skriv den private nøgle og addressen til output
print "Private key:\n" + sk.to_string().encode("hex")
print "Address: " + address_base58

På en simplificeret form:
# -*- coding: utf-8 -*-

"""
Bitcoin addresse-generator
Lavet af Doctor Blue (2013)

DEPENDENCIES:
- ecdsa (Elliptical Curve Digital Signature Algorithm)
- base58

Begge libraries kan hentes vha. pip

NOTE:
Koden er ekstremt redundant (og usikker) og udelukkende produceret
for at give en bedre forståelse for hvordan addresser genereres.
"""

from ecdsa import ecdsa
from ecdsa.curves import SECP256k1
from ecdsa import ellipticcurve
from ecdsa import SigningKey
import random
import hashlib
import base58

# Generer en offentlig og en privat nøgle baseret på SECP256k1 kurven
sk = SigningKey.generate(SECP256k1)
vk = sk.get_verifying_key()

# Tilføj 0x04 til den offentlige nøgle
# (Dette har intet med netværk at gøre, det skal bare være der)
pubkey = "\x04" + vk.to_string()

# Hash nøglen med SHA-256
pubkey_sha = hashlib.sha256(pubkey).digest()

# Hash nøglen med RIPEMD-160 og sæt 0x00 foran
# 0x00 - Bitcoin
# 0x6F - Bitcoin testnet3
# 0x48 - Litecoin
ripe = hashlib.new("ripemd160")
ripe.update(pubkey_sha)
pubkey_ripe = "\x00" + ripe.digest()

# OBS: b58encode_check hasher værdien to gange med SHA-256 og tilføjer
# de første 4 bytes i slutningen af strengen hvorefter den konverterer
# den binære værdi til en base58 værdi
address_base58 = base58.b58encode_check(pubkey_ripe)

# Skriv den private nøgle og addressen til output
print "Private key:\n" + sk.to_string().encode("hex")
print "Address: " + address_base58

Alle hex/binary konverteringer er slettet og ecdsa libraryet bruges til at generere og tilføje checksummen.
(24-11-2013, 23:02)Cue Skrev: [ -> ]Interessant, har aldrig tænkt på hvordan de laves, det var da lidt af en eye opener, giver lidt at gruble over.. :)

Hvis du virkelig vil have noget at gruble over, så skal du prøve at undersøge hvordan ECDSA fungerer. Det er hård matematik kan jeg godt sige dig. Min hovedpine er kun lige gået over og jeg har ikke undersøgt det specielt grundigt ^^
Bestem interessant.... takker!