Created
November 8, 2017 11:12
-
-
Save savasadar/9b28a5d48bac788239472fdd367771ae to your computer and use it in GitHub Desktop.
The following code produces sample 30-character SHA256-based mini private keys in Python.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random | |
import hashlib | |
BASE58 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' | |
def Candidate(): | |
""" | |
Generate a random, well-formed mini private key. | |
""" | |
return('%s%s' % ('S', ''.join( | |
[BASE58[ random.randrange(0,len(BASE58)) ] for i in range(29)]))) | |
def GenerateKeys(numKeys = 10): | |
""" | |
Generate mini private keys and output the mini key as well as the full | |
private key. numKeys is The number of keys to generate, and | |
""" | |
keysGenerated = 0 | |
totalCandidates = 0 | |
while keysGenerated < numKeys: | |
try: | |
cand = Candidate() | |
# Do typo check | |
t = '%s?' % cand | |
# Take one round of SHA256 | |
candHash = hashlib.sha256(t).digest() | |
# Check if the first eight bits of the hash are 0 | |
if candHash[0] == '\x00': | |
privateKey = GetPrivateKey(cand) | |
print('\n%s\nSHA256( ): %s\nsha256(?): %s' % | |
(cand, privateKey, candHash.encode('hex_codec'))) | |
if CheckShortKey(cand): | |
print('Validated.') | |
else: | |
print('Invalid!') | |
keysGenerated += 1 | |
totalCandidates += 1 | |
except KeyboardInterrupt: | |
break | |
print('\n%s: %i\n%s: %i\n%s: %.1f' % | |
('Keys Generated', keysGenerated, | |
'Total Candidates', totalCandidates, | |
'Reject Percentage', | |
100*(1.0-keysGenerated/float(totalCandidates)))) | |
def GetPrivateKey(shortKey): | |
""" | |
Returns the hexadecimal representation of the private key corresponding | |
to the given short key. | |
""" | |
if CheckShortKey(shortKey): | |
return hashlib.sha256(shortKey).hexdigest() | |
else: | |
print('Typo detected in private key!') | |
return None | |
def CheckShortKey(shortKey): | |
""" | |
Checks for typos in the short key. | |
""" | |
if len(shortKey) != 30: | |
return False | |
t = '%s?' % shortKey | |
tHash = hashlib.sha256(t).digest() | |
# Check to see that first byte is \x00 | |
if tHash[0] == '\x00': | |
return True | |
return False |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment