67 lines
2.0 KiB
Python
Executable File
67 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Bitcoin Wallet Generation Script
|
|
|
|
This script generates a Bitcoin wallet and stores it in a KeePassXC database file (KDBX format).
|
|
The wallet includes a BIP-0039 mnemonic seed phrase, Bitcoin address, and a QR code representation
|
|
of the seed phrase. The database file is password protected to ensure the security of the wallet.
|
|
|
|
Usage: ./generate_btc_wallet.py
|
|
"""
|
|
|
|
import gc
|
|
from getpass import getpass
|
|
from mnemonic import Mnemonic
|
|
from bitcoinlib.keys import HDKey
|
|
from pykeepass import create_database
|
|
|
|
MNEMONIC_STRENGTH=256
|
|
SUBKEY_PATH="m/0/0"
|
|
|
|
# Generate a BIP-0039 mnemonic seed phrase
|
|
mnemonic = Mnemonic("english")
|
|
SEED_PHRASE = mnemonic.generate(strength=MNEMONIC_STRENGTH)
|
|
|
|
# Derive the HDKey from the seed phrase
|
|
hd_key = HDKey.from_passphrase(SEED_PHRASE)
|
|
|
|
# Derive the Bitcoin address from the HDKey
|
|
child_key = hd_key.subkey_for_path(SUBKEY_PATH)
|
|
address = child_key.address()
|
|
|
|
# Prompt for custom name for the wallet
|
|
wallet_name = input(
|
|
"Whould you like to name this wallet? (empty for using the address as name): "
|
|
).strip()
|
|
|
|
# Create the database filename with the wallet number
|
|
if wallet_name == "":
|
|
wallet_name = address
|
|
else:
|
|
wallet_name = wallet_name[:100].strip()
|
|
|
|
db_filename = f"{wallet_name}.kdbx"
|
|
|
|
# Prompt the user for the passphrase
|
|
passphrase = getpass("Enter passphrase for the KeePassXC database: ")
|
|
|
|
try:
|
|
# Create a KeePassXC database file
|
|
db = create_database(db_filename, password=passphrase)
|
|
|
|
# Create an entrys in the root group
|
|
address_and_path_entry = db.add_entry(db.root_group, wallet_name, username=address, password=SUBKEY_PATH)
|
|
seed_phrase_entry = db.add_entry(db.root_group, "Bitcoin Master Seed", username="put me in safe", password=SEED_PHRASE)
|
|
|
|
# Save the database
|
|
db.save()
|
|
except Exception as e:
|
|
print("Error while creating keepassxc database. Disk full? Readonly?")
|
|
finally:
|
|
del SEED_PHRASE, address, hd_key, passphrase, mnemonic
|
|
gc.collect()
|
|
|
|
print("---")
|
|
print("Bitcoin address was successfully created. You can find at: " + db_filename)
|
|
print("---")
|