N33Bcoin Address Generator Bitcoin: Difference between revisions

From CompleteNoobs
Jump to navigation Jump to search
AwesomO (talk | contribs)
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..."
 
AwesomO (talk | contribs)
 
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

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