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