130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
"""Search seed such that:
|
|
sha512(seed + string).startswith(prefix)
|
|
|
|
Run like:
|
|
|
|
time for i in $(seq 2 7) ; do hyperfine --show-output "python perf.py --version $i AFPy 00000" > hyperfine-AFPy.$i; done
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
from itertools import product
|
|
from random import choices, choice
|
|
from types import SimpleNamespace
|
|
from string import ascii_uppercase, ascii_lowercase
|
|
from hashlib import sha512
|
|
|
|
POOL = ascii_uppercase + "[\\]^_`" + ascii_lowercase
|
|
|
|
|
|
def main_v1():
|
|
args = parse_args()
|
|
already_checked = []
|
|
while True:
|
|
c = "".join(choice(POOL) for _ in range(10))
|
|
if c in already_checked:
|
|
continue
|
|
already_checked.append(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
print("Searching")
|
|
|
|
|
|
def main_v2():
|
|
args = parse_args()
|
|
already_checked = set()
|
|
while True:
|
|
c = "".join(choice(POOL) for _ in range(10))
|
|
if c in already_checked:
|
|
continue
|
|
already_checked.add(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
print("Searching")
|
|
|
|
|
|
# Use choices
|
|
def main_v3():
|
|
args = parse_args()
|
|
already_checked = set()
|
|
while True:
|
|
c = "".join(choices(POOL, k=10))
|
|
if c in already_checked:
|
|
continue
|
|
already_checked.add(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
print("Searching")
|
|
|
|
|
|
# Use product
|
|
def main_v4():
|
|
args = parse_args()
|
|
already_checked = set()
|
|
for c in product(POOL, repeat=10):
|
|
c = "".join(c)
|
|
if c in already_checked:
|
|
continue
|
|
already_checked.add(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
print("Searching")
|
|
|
|
|
|
# Drop print
|
|
def main_v5():
|
|
args = parse_args()
|
|
already_checked = set()
|
|
for c in product(POOL, repeat=10):
|
|
c = "".join(c)
|
|
if c in already_checked:
|
|
continue
|
|
already_checked.add(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
|
|
|
|
# Drop useless lines
|
|
def main_v6():
|
|
args = parse_args()
|
|
for c in product(POOL, repeat=10):
|
|
c = "".join(c)
|
|
digest = sha512((c + args.string).encode("UTF-8")).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({c} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
|
|
|
|
# Bytes only
|
|
def main_v7():
|
|
args = parse_args()
|
|
string = args.string.encode("UTF-8")
|
|
pool = POOL.encode("UTF-8")
|
|
for c in product(pool, repeat=10):
|
|
digest = sha512(bytes(c) + string).hexdigest()
|
|
if digest.startswith(args.sha_prefix):
|
|
print(f"sha512({bytes(c)} + {args.string}) = {digest}")
|
|
sys.exit(0)
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("string")
|
|
parser.add_argument("sha_prefix")
|
|
parser.add_argument("--version", default="1")
|
|
return parser.parse_args()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
globals()["main_v" + parse_args().version]()
|