N33Bcoin Address Generator Bitcoin: Difference between revisions
Created page with "Note: Should work on Bitcoin - Untested on Bitcoin - developed by Noob's do not trust, you been warned. * This script does the following: ** It takes user input as a seed (which can be 12 words or any random input). ** It generates a deterministic seed by hashing the input. ** It uses this seed to create an ECDSA private key on the secp256k1 curve (used by Bitcoin and n33bcoin). ** It derives the public key from the private key. ** It generates a N33B coin address from..." |
|||
Line 84: | Line 84: | ||
* This is a simplified implementation and should not be used for managing real funds without further security measures. | * This is a simplified implementation and should not be used for managing real funds without further security measures. | ||
* Always keep your private keys secret and secure. | * Always keep your private keys secret and secure. | ||
== Address Prefix == | |||
Blockchain currencies like Bitcoin use special encoded strings to represent addresses. <br> | |||
These strings typically follow a format called Base58Check, where a prefix (a single byte) determines the first character of the address.<br> | |||
* Line 129 (of bitcoin 0.14.3): Chainparams.cpp - this is bitcoins default and the leading symbol for the public adddress is <b>1</b> | |||
<code>base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);</code> | |||
* In LiteCoin this was changed to start with an <b>L</b> by using the prefix <b>48</b> | |||
<code>base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,48);</code> | |||
* To start the Leading symbol of the Public Address with an <b>N</b> we change the prefix to <b>53</b> | |||
<code>base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,53);</code> | |||
* [[NoobCoin_List_of_address_prefixes| You can Find/See the the Starting Symbol for each prefix here]] | |||
===Changes required on script if you change Leading Symbol === | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
Line Numbered Script: | |||
<div class="mw-collapsible-content"> | |||
<pre> | |||
1 import hashlib | |||
2 import ecdsa | |||
3 import base58 | |||
4 | |||
5 # Python3 - this script depends on 'ecdsa', 'base58'. | |||
6 # sudo apt install python3-ecdsa python3-base58 | |||
7 | |||
8 def generate_n33bcoin_keypair(seed): | |||
9 # Generate a deterministic seed from the input | |||
10 seed_hash = hashlib.sha256(seed.encode()).digest() | |||
11 | |||
12 # Use the seed to generate a private key | |||
13 signing_key = ecdsa.SigningKey.from_string(seed_hash, curve=ecdsa.SECP256k1) | |||
14 private_key = signing_key.to_string().hex() | |||
15 | |||
16 # Generate the public key | |||
17 verifying_key = signing_key.get_verifying_key() | |||
18 public_key = '04' + verifying_key.to_string().hex() | |||
19 | |||
20 # Generate n33bcoin address (same as Bitcoin mainnet) | |||
21 public_key_bytes = bytes.fromhex(public_key) | |||
22 sha256_hash = hashlib.sha256(public_key_bytes).digest() | |||
23 ripemd160_hash = hashlib.new('ripemd160', sha256_hash).digest() | |||
24 | |||
25 # n33bcoin mainnet address (version byte 0x00, starts with '1') | |||
26 version_byte = b'\x00' # Decimal 0, Bitcoin-like mainnet | |||
27 full_hash = version_byte + ripemd160_hash | |||
28 checksum = hashlib.sha256(hashlib.sha256(full_hash).digest()).digest()[:4] | |||
29 n33bcoin_address = base58.b58encode(full_hash + checksum).decode('utf-8') | |||
30 | |||
31 # n33bcoin WIF private key (version byte 0x80, Bitcoin-like mainnet) | |||
32 version_byte_wif = b'\x80' # Decimal 128 | |||
33 extended_key = version_byte_wif + bytes.fromhex(private_key) | |||
34 checksum = hashlib.sha256(hashlib.sha256(extended_key).digest()).digest()[:4] | |||
35 wif_private_key = base58.b58encode(extended_key + checksum).decode('utf-8') | |||
36 | |||
37 return { | |||
38 'private_key': private_key, | |||
39 'public_key': public_key, | |||
40 'n33bcoin_address': n33bcoin_address, | |||
41 'wif_private_key': wif_private_key | |||
42 } | |||
43 | |||
44 def main(): | |||
45 print("Enter your seed (12 words or any random input):") | |||
46 seed = input().strip() | |||
47 | |||
48 keypair = generate_n33bcoin_keypair(seed) | |||
49 | |||
50 print("\nGenerated n33bcoin Key Pair:") | |||
51 print(f"Private Key: {keypair['private_key']}") | |||
52 print(f"Public Key: {keypair['public_key']}") | |||
53 print(f"n33bcoin Address: {keypair['n33bcoin_address']}") | |||
54 print(f"WIF Private Key: {keypair['wif_private_key']}") | |||
55 | |||
56 if __name__ == "__main__": | |||
57 main() | |||
</pre> | |||
</div> | |||
</div> | |||
* On Line Number 26 you will see the line we need to change: | |||
<code>version_byte = b'\x00' # Decimal 0, Bitcoin-like mainnet</code> | |||
[[NoobCoin_List_of_address_prefixes| Find the Decimal number you need]] and [[Hex_numbers_explained| convert that Decimal into a Hex Number]] | |||
Example: For the Starting Symbol we want <b>N</b> the Decimal number for <b>N</b> is <b>53</b> to convert 53 to hex <code>3x16 = 48 + 5 = 53</code> the hex number is <b>35</b> - that's 3x16's and 5. | |||
* We can now change/append line 26 to include the value for are starting symbol. | |||
<pre> version_byte = b'\x35' # Decimal 53, for n33bcoin addresses starting with 'N'</pre> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
This would be the script if you changed your blockchain to include <b>N</b> as your starting symbol in public addresses: | |||
<div class="mw-collapsible-content"> | |||
<pre> | |||
import hashlib | |||
import ecdsa | |||
import base58 | |||
# Python3 - this script depends on 'ecdsa', 'base58'. | |||
# sudo apt install python3-ecdsa python3-base58 | |||
def generate_n33bcoin_keypair(seed): | |||
# Generate a deterministic seed from the input | |||
seed_hash = hashlib.sha256(seed.encode()).digest() | |||
# Use the seed to generate a private key | |||
signing_key = ecdsa.SigningKey.from_string(seed_hash, curve=ecdsa.SECP256k1) | |||
private_key = signing_key.to_string().hex() | |||
# Generate the public key | |||
verifying_key = signing_key.get_verifying_key() | |||
public_key = '04' + verifying_key.to_string().hex() | |||
# Generate n33bcoin address (version byte 0x35 for 'N' prefix) | |||
public_key_bytes = bytes.fromhex(public_key) | |||
sha256_hash = hashlib.sha256(public_key_bytes).digest() | |||
ripemd160_hash = hashlib.new('ripemd160', sha256_hash).digest() | |||
# n33bcoin mainnet address (version byte 0x35, starts with 'N') | |||
version_byte = b'\x35' # Decimal 53, for n33bcoin addresses starting with 'N' | |||
full_hash = version_byte + ripemd160_hash | |||
checksum = hashlib.sha256(hashlib.sha256(full_hash).digest()).digest()[:4] | |||
n33bcoin_address = base58.b58encode(full_hash + checksum).decode('utf-8') | |||
# n33bcoin WIF private key (version byte 0x80, Bitcoin-like mainnet) | |||
version_byte_wif = b'\x80' # Decimal 128, unchanged unless specified | |||
extended_key = version_byte_wif + bytes.fromhex(private_key) | |||
checksum = hashlib.sha256(hashlib.sha256(extended_key).digest()).digest()[:4] | |||
wif_private_key = base58.b58encode(extended_key + checksum).decode('utf-8') | |||
return { | |||
'private_key': private_key, | |||
'public_key': public_key, | |||
'n33bcoin_address': n33bcoin_address, | |||
'wif_private_key': wif_private_key | |||
} | |||
def main(): | |||
print("Enter your seed (12 words or any random input):") | |||
seed = input().strip() | |||
keypair = generate_n33bcoin_keypair(seed) | |||
print("\nGenerated n33bcoin Key Pair:") | |||
print(f"Private Key: {keypair['private_key']}") | |||
print(f"Public Key: {keypair['public_key']}") | |||
print(f"n33bcoin Address: {keypair['n33bcoin_address']}") | |||
print(f"WIF Private Key: {keypair['wif_private_key']}") | |||
if __name__ == "__main__": | |||
main() | |||
</pre> | |||
</div> | |||
</div> | |||
==Results== | ==Results== | ||
* Sample output - using seed 'hithere' | * Sample output - using seed 'hithere' |
Latest revision as of 15:26, 7 July 2025
Note: Should work on Bitcoin - Untested on Bitcoin - developed by Noob's do not trust, you been warned.
- This script does the following:
- It takes user input as a seed (which can be 12 words or any random input).
- It generates a deterministic seed by hashing the input.
- It uses this seed to create an ECDSA private key on the secp256k1 curve (used by Bitcoin and n33bcoin).
- It derives the public key from the private key.
- It generates a N33B coin address from the public key.
- It creates a WIF (Wallet Import Format) version of the private key.
- Install the required libraries
sudo apt install python3-ecdsa python3-base58
- Install the required libraries
Script
$EDITOR add_bit_gen.py
import hashlib import ecdsa import base58 # Python3 - this script depends on 'ecdsa', 'base58'. # sudo apt install python3-ecdsa python3-base58 def generate_n33bcoin_keypair(seed): # Generate a deterministic seed from the input seed_hash = hashlib.sha256(seed.encode()).digest() # Use the seed to generate a private key signing_key = ecdsa.SigningKey.from_string(seed_hash, curve=ecdsa.SECP256k1) private_key = signing_key.to_string().hex() # Generate the public key verifying_key = signing_key.get_verifying_key() public_key = '04' + verifying_key.to_string().hex() # Generate n33bcoin address (same as Bitcoin mainnet) public_key_bytes = bytes.fromhex(public_key) sha256_hash = hashlib.sha256(public_key_bytes).digest() ripemd160_hash = hashlib.new('ripemd160', sha256_hash).digest() # n33bcoin mainnet address (version byte 0x00, starts with '1') version_byte = b'\x00' # Decimal 0, Bitcoin-like mainnet full_hash = version_byte + ripemd160_hash checksum = hashlib.sha256(hashlib.sha256(full_hash).digest()).digest()[:4] n33bcoin_address = base58.b58encode(full_hash + checksum).decode('utf-8') # n33bcoin WIF private key (version byte 0x80, Bitcoin-like mainnet) version_byte_wif = b'\x80' # Decimal 128 extended_key = version_byte_wif + bytes.fromhex(private_key) checksum = hashlib.sha256(hashlib.sha256(extended_key).digest()).digest()[:4] wif_private_key = base58.b58encode(extended_key + checksum).decode('utf-8') return { 'private_key': private_key, 'public_key': public_key, 'n33bcoin_address': n33bcoin_address, 'wif_private_key': wif_private_key } def main(): print("Enter your seed (12 words or any random input):") seed = input().strip() keypair = generate_n33bcoin_keypair(seed) print("\nGenerated n33bcoin Key Pair:") print(f"Private Key: {keypair['private_key']}") print(f"Public Key: {keypair['public_key']}") print(f"n33bcoin Address: {keypair['n33bcoin_address']}") print(f"WIF Private Key: {keypair['wif_private_key']}") if __name__ == "__main__": main()
- If saved as
add_bit_gen.py
- Then run as so:
pyhon3 add_bit_gen.py
- Enter your seed when prompted.
- The script will output the private key, public key, N33Bcoin address, and WIF private key.
Note's
Important notes:
- This script generates reproducible results, meaning the same input will always produce the same key pair.
- The security of your keys depends on the randomness and secrecy of your input seed.
- Use a strong, unique seed for real-world use.
- This is a simplified implementation and should not be used for managing real funds without further security measures.
- Always keep your private keys secret and secure.
Address Prefix
Blockchain currencies like Bitcoin use special encoded strings to represent addresses.
These strings typically follow a format called Base58Check, where a prefix (a single byte) determines the first character of the address.
- Line 129 (of bitcoin 0.14.3): Chainparams.cpp - this is bitcoins default and the leading symbol for the public adddress is 1
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
- In LiteCoin this was changed to start with an L by using the prefix 48
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,48);
- To start the Leading symbol of the Public Address with an N we change the prefix to 53
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,53);
Changes required on script if you change Leading Symbol
Line Numbered Script:
1 import hashlib 2 import ecdsa 3 import base58 4 5 # Python3 - this script depends on 'ecdsa', 'base58'. 6 # sudo apt install python3-ecdsa python3-base58 7 8 def generate_n33bcoin_keypair(seed): 9 # Generate a deterministic seed from the input 10 seed_hash = hashlib.sha256(seed.encode()).digest() 11 12 # Use the seed to generate a private key 13 signing_key = ecdsa.SigningKey.from_string(seed_hash, curve=ecdsa.SECP256k1) 14 private_key = signing_key.to_string().hex() 15 16 # Generate the public key 17 verifying_key = signing_key.get_verifying_key() 18 public_key = '04' + verifying_key.to_string().hex() 19 20 # Generate n33bcoin address (same as Bitcoin mainnet) 21 public_key_bytes = bytes.fromhex(public_key) 22 sha256_hash = hashlib.sha256(public_key_bytes).digest() 23 ripemd160_hash = hashlib.new('ripemd160', sha256_hash).digest() 24 25 # n33bcoin mainnet address (version byte 0x00, starts with '1') 26 version_byte = b'\x00' # Decimal 0, Bitcoin-like mainnet 27 full_hash = version_byte + ripemd160_hash 28 checksum = hashlib.sha256(hashlib.sha256(full_hash).digest()).digest()[:4] 29 n33bcoin_address = base58.b58encode(full_hash + checksum).decode('utf-8') 30 31 # n33bcoin WIF private key (version byte 0x80, Bitcoin-like mainnet) 32 version_byte_wif = b'\x80' # Decimal 128 33 extended_key = version_byte_wif + bytes.fromhex(private_key) 34 checksum = hashlib.sha256(hashlib.sha256(extended_key).digest()).digest()[:4] 35 wif_private_key = base58.b58encode(extended_key + checksum).decode('utf-8') 36 37 return { 38 'private_key': private_key, 39 'public_key': public_key, 40 'n33bcoin_address': n33bcoin_address, 41 'wif_private_key': wif_private_key 42 } 43 44 def main(): 45 print("Enter your seed (12 words or any random input):") 46 seed = input().strip() 47 48 keypair = generate_n33bcoin_keypair(seed) 49 50 print("\nGenerated n33bcoin Key Pair:") 51 print(f"Private Key: {keypair['private_key']}") 52 print(f"Public Key: {keypair['public_key']}") 53 print(f"n33bcoin Address: {keypair['n33bcoin_address']}") 54 print(f"WIF Private Key: {keypair['wif_private_key']}") 55 56 if __name__ == "__main__": 57 main()
- On Line Number 26 you will see the line we need to change:
version_byte = b'\x00' # Decimal 0, Bitcoin-like mainnet
Find the Decimal number you need and convert that Decimal into a Hex Number
Example: For the Starting Symbol we want N the Decimal number for N is 53 to convert 53 to hex 3x16 = 48 + 5 = 53
the hex number is 35 - that's 3x16's and 5.
- We can now change/append line 26 to include the value for are starting symbol.
version_byte = b'\x35' # Decimal 53, for n33bcoin addresses starting with 'N'
This would be the script if you changed your blockchain to include N as your starting symbol in public addresses:
import hashlib import ecdsa import base58 # Python3 - this script depends on 'ecdsa', 'base58'. # sudo apt install python3-ecdsa python3-base58 def generate_n33bcoin_keypair(seed): # Generate a deterministic seed from the input seed_hash = hashlib.sha256(seed.encode()).digest() # Use the seed to generate a private key signing_key = ecdsa.SigningKey.from_string(seed_hash, curve=ecdsa.SECP256k1) private_key = signing_key.to_string().hex() # Generate the public key verifying_key = signing_key.get_verifying_key() public_key = '04' + verifying_key.to_string().hex() # Generate n33bcoin address (version byte 0x35 for 'N' prefix) public_key_bytes = bytes.fromhex(public_key) sha256_hash = hashlib.sha256(public_key_bytes).digest() ripemd160_hash = hashlib.new('ripemd160', sha256_hash).digest() # n33bcoin mainnet address (version byte 0x35, starts with 'N') version_byte = b'\x35' # Decimal 53, for n33bcoin addresses starting with 'N' full_hash = version_byte + ripemd160_hash checksum = hashlib.sha256(hashlib.sha256(full_hash).digest()).digest()[:4] n33bcoin_address = base58.b58encode(full_hash + checksum).decode('utf-8') # n33bcoin WIF private key (version byte 0x80, Bitcoin-like mainnet) version_byte_wif = b'\x80' # Decimal 128, unchanged unless specified extended_key = version_byte_wif + bytes.fromhex(private_key) checksum = hashlib.sha256(hashlib.sha256(extended_key).digest()).digest()[:4] wif_private_key = base58.b58encode(extended_key + checksum).decode('utf-8') return { 'private_key': private_key, 'public_key': public_key, 'n33bcoin_address': n33bcoin_address, 'wif_private_key': wif_private_key } def main(): print("Enter your seed (12 words or any random input):") seed = input().strip() keypair = generate_n33bcoin_keypair(seed) print("\nGenerated n33bcoin Key Pair:") print(f"Private Key: {keypair['private_key']}") print(f"Public Key: {keypair['public_key']}") print(f"n33bcoin Address: {keypair['n33bcoin_address']}") print(f"WIF Private Key: {keypair['wif_private_key']}") if __name__ == "__main__": main()
Results
- Sample output - using seed 'hithere'
noob@noob-ThinkPad-T470:~/Gen/py-pub-prv$ python3 gen.py Enter your seed (12 words or any random input): hithere Generated n33bcoin Key Pair: Private Key: 3e4748d72b0a0c5d4538b52a2ade025a0f52a1e8642384ac14e5af0f90b8ab8a Public Key: 04c4cab1795312dafbf2532c7b238d448b55fa151a3d4e059cb49b47fb7244fb8767981b561c067494f9f3a6357024bb4fa71d12d692a733f7a0583d6fa7276548 n33bcoin Address: 13j4do7QupXYPVtgmkkbP2gfe8ETnErrnG WIF Private Key: 5JHiQDRUFhw9HzSJFVmHjzpHDaF7TXP8A5hFDHssVvyQA2yVRTH
- Reproduced usig: 'hithere'
noob@noob-ThinkPad-T470:~/Gen/py-pub-prv$ python3 gen.py Enter your seed (12 words or any random input): hithere Generated n33bcoin Key Pair: Private Key: 3e4748d72b0a0c5d4538b52a2ade025a0f52a1e8642384ac14e5af0f90b8ab8a Public Key: 04c4cab1795312dafbf2532c7b238d448b55fa151a3d4e059cb49b47fb7244fb8767981b561c067494f9f3a6357024bb4fa71d12d692a733f7a0583d6fa7276548 n33bcoin Address: 13j4do7QupXYPVtgmkkbP2gfe8ETnErrnG WIF Private Key: 5JHiQDRUFhw9HzSJFVmHjzpHDaF7TXP8A5hFDHssVvyQA2yVRTH
- a space between words: 'hi there'
noob@CompleteNoobs:~/testin$ python3 add_bit_gen.py Enter your seed (12 words or any random input): hi there Generated N33Bcoin Key Pair: Private Key: 9b96a1fe1d548cbbc960cc6a0286668fd74a763667b06366fb2324269fcabaa4 Public Key: 04c20346f8bca6852b432ebd1317d58f616bd9bdcb094d6b563712dfbc820ffcd8a2325459cc2909ea4f2a982c65ba4688c0de5538d679249d25d91dcb8878c7e3 N33Bcoin Address: 1CTLQdpSqKE27fJcykm3BEVkWZdfN9888w WIF Private Key: 5JzosusicGeVVxbzsmu2uKpJjNPtni2ARvW7L5bdVy9Dyyo4Jfb
- reproduced on diff box - with same script:
ubuntu@py2:~/key_script$ python3 add_bit_gen.py Enter your seed (12 words or any random input): hi there Generated N33Bcoin Key Pair: Private Key: 9b96a1fe1d548cbbc960cc6a0286668fd74a763667b06366fb2324269fcabaa4 Public Key: 04c20346f8bca6852b432ebd1317d58f616bd9bdcb094d6b563712dfbc820ffcd8a2325459cc2909ea4f2a982c65ba4688c0de5538d679249d25d91dcb8878c7e3 N33Bcoin Address: 1CTLQdpSqKE27fJcykm3BEVkWZdfN9888w WIF Private Key: 5JzosusicGeVVxbzsmu2uKpJjNPtni2ARvW7L5bdVy9Dyyo4Jfb