OK, so I wanted to have a small script that I can use to generate new (offline) bitcoin addresses and be sure that the information was not stored anywhere or sent to anyone, but I couldn't find anything that does that that's also simple enough that I can read the source code and verify it myself.
anyway I ended up writing this python 2.5 script (and then decided to upload it here, in case it's useful to anyone else)
import ecdsa
secp256k1curve=ecdsa.ellipticcurve.CurveFp(115792089237316195423570985008687907853269984665640564039457584007908834671663,0,7)
secp256k1point=ecdsa.ellipticcurve.Point(secp256k1curve,0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8,0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141)
secp256k1=ecdsa.curves.Curve('secp256k1',secp256k1curve,secp256k1point,(1,3,132,0,10))
#--------------------------------------
import binascii, hashlib
def addy(pk):
pko=ecdsa.SigningKey.from_secret_exponent(pk,secp256k1)
pubkey=binascii.hexlify(pko.get_verifying_key().to_string())
pubkey2=hashlib.sha256(binascii.unhexlify('04'+pubkey)).hexdigest()
pubkey3=hashlib.new('ripemd160',binascii.unhexlify(pubkey2)).hexdigest()
pubkey4=hashlib.sha256(binascii.unhexlify('00'+pubkey3)).hexdigest()
pubkey5=hashlib.sha256(binascii.unhexlify(pubkey4)).hexdigest()
pubkey6=pubkey3+pubkey5[:8]
pubnum=int(pubkey6,16)
pubnumlist=[]
while pubnum!=0: pubnumlist.append(pubnum%58); pubnum/=58
address=''
for l in ['123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'[x] for x in pubnumlist]:
address=l+address
return '1'+address
print addy(0x18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725)
print addy(int(hashlib.sha256('something small and easy to remember but not easy to guess').hexdigest(),16))
print addy(int(hashlib.sha256(file('hiddeninplainsight.jpg','rb+').read()).hexdigest(),16))
The code uses the ecdsa library which can be found
here.
The address function takes a private key and returns the corresponding bitcoin address.
The last two lines have some practical uses of the address function. Since the sha256 hash function returns a 256 bit long value, it can be used to generate a private key. This is useful if you want to have a bitcoin address and private key that you can remember without having to write it down anywhere, or if you want to use a file that you have on your computer as the key. When you want to spend the coins that you have in that address, all you have to do is use the same function to generate the private key and address.
WARNING #1: using a file that you have on your computer or a short sentence to generate a private key / address pair makes it a lot easier for an attacker to guess your private key. Instead of having to try 2^256 possibilities, they only have to try the files on your computer one by one, or your favorite book/game/your birthday...
WARNING #2: I just made this script today and I'm fairly new to bitcoin. Use at your own risk !
woooo five posts i'm outta here