nomachine
|
 |
September 10, 2023, 10:29:57 AM |
|
in this example (python kangaroo parallel) :
with 4 cpu after changing little the code I have 73 second on laptop with Intel i5 for 2**50
you have "mismash" in code, you need clean code and rewrite
I updated the code to read and write "tame.txt & "wild.txt" files faster with buffering. Entered the coordinates X, Y to show at start...etc... I still don't have a time under 100 seconds for 2**50. Can you show me where the "mismash" in code is?  Thanks in advance! import time import os import sys import io import random import math import gmpy2 from gmpy2 import mpz from functools import lru_cache from multiprocessing import Pool, cpu_count
modulo = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) order = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141) Gx = gmpy2.mpz(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) Gy = gmpy2.mpz(0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y
PG = Point(Gx, Gy) Z = Point(0, 0) # zero-point, infinite in real x,y-plane
def mul2(P, p=modulo): c = (3 * P.x * P.x * pow(2 * P.y, -1, p)) % p R = Point() R.x = (c * c - 2 * P.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
def add(P, Q, p=modulo): dx = Q.x - P.x dy = Q.y - P.y c = dy * gmpy2.invert(dx, p) % p R = Point() R.x = (c * c - P.x - Q.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
@lru_cache(maxsize=None) def X2Y(X, y_parity, p=modulo): Y = 3 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
X = (tmp + 7) % p
Y = (p + 1) // 4 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
Y = tmp
if Y % 2 != y_parity: Y = -Y % p
return Y
def compute_P_table(): P = [PG] for k in range(255): P.append(mul2(P[k])) return P
P = compute_P_table()
os.system("clear") t = time.ctime() sys.stdout.write("\033[01;33m") sys.stdout.write("################################################" + "\n") sys.stdout.write("Pollard-kangaroo PrivKey Recovery Tool multicore" + "\n") sys.stdout.write("################################################" + "\n") sys.stdout.write(t + "\n") sys.stdout.write("P-table prepared" + "\n") sys.stdout.write("tame and wild herds kangaroos is being prepared" + "\n") sys.stdout.flush()
def comparator(A, Ak, B, Bk): result = set(A).intersection(set(B)) if result: sol_kt = A.index(next(iter(result))) sol_kw = B.index(next(iter(result))) difference = Ak[sol_kt] - Bk[sol_kw] HEX = "%064x" % difference # Convert to a hexadecimal string t = time.ctime() total_time = time.time() - starttime print("\033[01;33mSOLVED:", t, f"total time: {total_time:.2f} sec", HEX, "\n") with open("KEYFOUNDKEYFOUND.txt", "a") as file: file.write("\n\nSOLVED " + t) file.write(f"\nTotal Time: {total_time:.2f} sec") file.write("\nPrivate Key (decimal): " + str(difference)) file.write("\nPrivate Key (hex): " + HEX) file.write( "\n-------------------------------------------------------------------------------------------------------------------------------------\n" ) return True else: return False
# Batch writing function def batch_write_data_to_file(data, file_path, batch_size=5000): with open(file_path, "a", buffering=1024 * 1024 * 1024) as fp: for i in range(0, len(data), batch_size): batch = data[i : i + batch_size] fp.writelines(batch)
# Function to check and write data to file def check( P, Pindex, DP_rarity, file2save, A, Ak, B, Bk, buffer_size=1024 * 1024 * 1024 ): if P.x % DP_rarity == 0: A.append(P.x) Ak.append(Pindex) data_to_write = ["%064x %d\n" % (P.x, Pindex)] batch_write_data_to_file(data_to_write, file2save) # Batch write data to file # Print the public key message = "\rPublic key: {:064x}".format(P.x) sys.stdout.write("\033[01;33m") sys.stdout.write(message + "\r") sys.stdout.flush() return comparator(A, Ak, B, Bk) else: return False
def save2file(path, mode, data, buffer_size=1024 * 1024 * 1024): with open(path, mode, encoding="utf-8") as fp: if isinstance(data, (list, tuple, dict, set)): for line in data: if isinstance(line, str): fp.write(line) elif isinstance(line, int): fp.write(str(line)) elif isinstance(data, (str, int)): fp.write(str(data))
# Memoization for ecmultiply ecmultiply_memo = {}
def ecmultiply(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: if k in ecmultiply_memo: return ecmultiply_memo[k] else: result = ecmultiply(k // 2, mul2(P, p), p) ecmultiply_memo[k] = result return result else: return add(P, ecmultiply((k - 1) // 2, mul2(P, p), p))
def mulk(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: return mulk(k // 2, mul2(P, p), p) else: return add(P, mulk((k - 1) // 2, mul2(P, p), p))
def search(Nt, Nw, puzzle, kangoo_power, starttime): DP_rarity = 1 << ((puzzle - 2 * kangoo_power) // 2 - 2) hop_modulo = ((puzzle - 1) // 2) + kangoo_power T, t, dt = [], [], [] W, w, dw = [], [], [] for k in range(Nt): t.append((3 << (puzzle - 2)) + random.randint(1, (2 ** (puzzle - 1)))) T.append(mulk(t[k])) dt.append(0) for k in range(Nw): w.append(random.randint(1, (1 << (puzzle - 1)))) W.append(add(W0, mulk(w[k]))) dw.append(0) oldtime = time.time() Hops, Hops_old = 0, 0 t0 = time.time() oldtime = time.time() starttime = oldtime while True: for k in range(Nt): Hops += 1 pw = T[k].x % hop_modulo dt[k] = 1 << pw solved = check(T[k], t[k], DP_rarity, "tame.txt", T, t, W, w) if solved: return "sol. time: %.2f sec" % (time.time() - starttime) t[k] += dt[k] T[k] = add(P[pw], T[k]) for k in range(Nw): Hops += 1 pw = W[k].x % hop_modulo dw[k] = 1 << pw solved = check(W[k], w[k], DP_rarity, "wild.txt", W, w, T, t) if solved: return "sol. time: %.2f sec" % (time.time() - starttime) w[k] += dw[k] W[k] = add(P[pw], W[k])
puzzle = 50 compressed_public_key = ( "03f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6" # Puzzle 50 ) kangoo_power = 11 # For Puzzle 50-56 use 9 to 11, for Puzzle 60-80 use 14 to 16 / 24 cores or above preferred Nt = Nw = 2**kangoo_power # check format pubkey if len(compressed_public_key) == 66: X = int(compressed_public_key[2:66], 16) # calculation Y from X if pubkey is compressed Y = X2Y(X, gmpy2.mpz(compressed_public_key[:2]) - 2) else: print("[error] pubkey len(66/130) invalid!")
print(f"[Puzzle]: {puzzle}") print("[Xcoordinate]: %064x" % X) print("[Ycoordinate]: %064x" % Y)
W0 = Point(X, Y) starttime = oldtime = time.time()
Hops = 0 random.seed()
hops_list = [] N_tests = kangoo_power
for k in range(N_tests): # Create empty 'tame.txt' and 'wild.txt' files for each iteration save2file("tame.txt", "w", "") save2file("wild.txt", "w", "")
def parallel_search(process_count, Nt, Nw, puzzle, kangoo_power, starttime): pool = Pool(process_count) results = pool.starmap( search, [(Nt, Nw, puzzle, kangoo_power, starttime)] * process_count ) pool.close() pool.join() return results
if __name__ == "__main__": process_count = cpu_count() # Use all available CPU cores print(f"Using {process_count} CPU cores for parallel search.") results = parallel_search(process_count, Nt, Nw, puzzle, kangoo_power, starttime) for result in results: print(result)
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
citb0in
|
 |
September 10, 2023, 01:22:37 PM |
|
anyone can answer, please? is there a well-known working and maintained version of Kangaroo that is capable to process keys >125 bit ? I'm asking because the original version of JLP says: This program is limited to a 125bit interval search.
If I understand correctly that means I cannot use it for trying to crack puzzles >125bit, right?
|
Some signs are invisible, some paths are hidden - but those who see, know what to do. Follow the trail - Follow your intuition - [bc1qqnrjshpjpypepxvuagatsqqemnyetsmvzqnafh]
|
|
|
citb0in
|
 |
September 10, 2023, 02:25:13 PM |
|
anyone can answer, please? is there a well-known working and maintained version of Kangaroo that is capable to process keys >125 bit ? I'm asking because the original version of JLP says: This program is limited to a 125bit interval search.
If I understand correctly that means I cannot use it for trying to crack puzzles >125bit, right? void Kangaroo::CreateJumpTable() {
#ifdef USE_SYMMETRY int jumpBit = rangePower / 2; #else int jumpBit = rangePower / 2 + 1; #endif
if(jumpBit > 128) jumpBit = 128; int maxRetry = 100; bool ok = false; double distAvg; double maxAvg = pow(2.0,(double)jumpBit - 0.95); double minAvg = pow(2.0,(double)jumpBit - 1.05); //::printf("Jump Avg distance min: 2^%.2f\n",log2(minAvg)); //::printf("Jump Avg distance max: 2^%.2f\n",log2(maxAvg)); // Kangaroo jumps // Constant seed for compatibilty of workfiles rseed(0x600DCAFE);
you have max setup : 128 bit as jumpBit if more if(jumpBit > 128) jumpBit = 128; I appreciate your reply however I am not sure if understood. You mean I just need to adjust the Kangaroo.cpp and recompile it? You said 128 bits, cannot we adjust it to allow up to 160bits by replacing 128 by 160 ? Did JLP intensionally implement this restriction with 128bits? And why does he say 125bits while the C++ source code says 128bit ?
|
Some signs are invisible, some paths are hidden - but those who see, know what to do. Follow the trail - Follow your intuition - [bc1qqnrjshpjpypepxvuagatsqqemnyetsmvzqnafh]
|
|
|
citb0in
|
 |
September 10, 2023, 03:08:49 PM |
|
understood. Thank you for clarification @ecdsa123 I just ran a successful test with a 129bit key and it worked like a charm.
One more question related to Kangaroo program. Let's say I run Kangaroo and search for a 145bit key. I run it for 1 hour and then quit it because no key was found. Then I re-execute exactly the same command. Will the program iterate through the same values as it did on run first or is it theoretically possible that the 2nd run will find a key? My question basically is: does it behave like VanitySearch where it's theoretically possible to find a match each second regardless of what happened in the history and which range was scanned. Or does it behave more like BitCrack which searches in linear mode ?
|
Some signs are invisible, some paths are hidden - but those who see, know what to do. Follow the trail - Follow your intuition - [bc1qqnrjshpjpypepxvuagatsqqemnyetsmvzqnafh]
|
|
|
nomachine
|
 |
September 10, 2023, 04:34:42 PM |
|
Little explanation. I have at the moment no time for writing for you all code. ( you should write thread in search def) read carefullty the change implement by me import sys import io import random import math import gmpy2 from gmpy2 import mpz from functools import lru_cache from multiprocessing import Pool, cpu_count
modulo = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) order = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141) Gx = gmpy2.mpz(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) Gy = gmpy2.mpz(0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y
PG = Point(Gx, Gy) Z = Point(0, 0) # zero-point, infinite in real x,y-plane
def mul2(P, p=modulo): c = (3 * P.x * P.x * pow(2 * P.y, -1, p)) % p R = Point() R.x = (c * c - 2 * P.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
def add(P, Q, p=modulo): dx = Q.x - P.x dy = Q.y - P.y c = dy * gmpy2.invert(dx, p) % p R = Point() R.x = (c * c - P.x - Q.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
@lru_cache(maxsize=None) def X2Y(X, y_parity, p=modulo): Y = 3 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
X = (tmp + 7) % p
Y = (p + 1) // 4 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
Y = tmp
if Y % 2 != y_parity: Y = -Y % p
return Y
def compute_P_table(): P = [PG] for k in range(255): P.append(mul2(P[k])) return P
P = compute_P_table()
os.system("clear") t = time.ctime() sys.stdout.write("\033[01;33m") sys.stdout.write("################################################" + "\n") sys.stdout.write("Pollard-kangaroo PrivKey Recovery Tool multicore" + "\n") sys.stdout.write("################################################" + "\n") sys.stdout.write(t + "\n") sys.stdout.write("P-table prepared" + "\n") sys.stdout.write("tame and wild herds kangaroos is being prepared" + "\n") sys.stdout.flush()
def comparator(A, Ak, B, Bk): result = set(A).intersection(set(B)) if result: sol_kt = A.index(next(iter(result))) sol_kw = B.index(next(iter(result))) difference = Ak[sol_kt] - Bk[sol_kw] HEX = "%064x" % difference # Convert to a hexadecimal string t = time.ctime() total_time = time.time() - starttime print("\033[01;33mSOLVED:", t, f"total time: {total_time:.2f} sec", HEX, "\n") with open("KEYFOUNDKEYFOUND.txt", "a") as file: file.write("\n\nSOLVED " + t) file.write(f"\nTotal Time: {total_time:.2f} sec") file.write("\nPrivate Key (decimal): " + str(difference)) file.write("\nPrivate Key (hex): " + HEX) file.write( "\n-------------------------------------------------------------------------------------------------------------------------------------\n" )
return result
""" return True else: return False """
# Batch writing function def batch_write_data_to_file(data, file_path, batch_size=5000): with open(file_path, "a", buffering=1024 * 1024 * 1024) as fp: for i in range(0, len(data), batch_size): batch = data[i : i + batch_size] fp.writelines(batch)
# Function to check and write data to file def check( P, Pindex, DP_rarity, file2save, A, Ak, B, Bk, buffer_size=1024 * 1024 * 1024 ): if P.x % DP_rarity == 0: A.append(P.x) Ak.append(Pindex) data_to_write = ["%064x %d\n" % (P.x, Pindex)] ## YOU DONT USE TAME AND WILD IN SCRIPT! SO FOR WHAT IMPLEMENT IT? IT TAKING TIME AND MEMORY """ batch_write_data_to_file(data_to_write, file2save) # Batch write data to file # Print the public key message = "\rPublic key: {:064x}".format(P.x) sys.stdout.write("\033[01;33m") sys.stdout.write(message + "\r") sys.stdout.flush() """ return comparator(A, Ak, B, Bk) else: return False
def save2file(path, mode, data, buffer_size=1024 * 1024 * 1024): with open(path, mode, encoding="utf-8") as fp: if isinstance(data, (list, tuple, dict, set)): for line in data: if isinstance(line, str): fp.write(line) elif isinstance(line, int): fp.write(str(line)) elif isinstance(data, (str, int)): fp.write(str(data))
# Memoization for ecmultiply ecmultiply_memo = {}
def ecmultiply(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: if k in ecmultiply_memo: return ecmultiply_memo[k] else: result = ecmultiply(k // 2, mul2(P, p), p) ecmultiply_memo[k] = result return result else: return add(P, ecmultiply((k - 1) // 2, mul2(P, p), p))
def mulk(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: return mulk(k // 2, mul2(P, p), p) else: return add(P, mulk((k - 1) // 2, mul2(P, p), p))
def search(Nt, Nw, puzzle, kangoo_power, starttime): # NOT NECESSARY - TAKING TIME AS MULTIPLY BY PROCESS -> THING AS MINIMALISED TIME FOR OPERATION -> BETTER JOIN FOR ALL PROCESSING Moved ! """ DP_rarity = 1 << ((puzzle - 2 * kangoo_power) // 2 - 2) hop_modulo = ((puzzle - 1) // 2) + kangoo_power T, t, dt = [], [], [] W, w, dw = [], [], [] """ for k in range(Nt): t.append((3 << (puzzle - 2)) + random.randint(1, (2 ** (puzzle - 1)))) T.append(mulk(t[k])) dt.append(0) for k in range(Nw): w.append(random.randint(1, (1 << (puzzle - 1)))) W.append(add(W0, mulk(w[k]))) dw.append(0) #oldtime = time.time() -> NOT USING TAKING TIME Hops, Hops_old = 0, 0 #t0 = time.time() -> NOT USING TAKING TIME oldtime = time.time() starttime = oldtime while True: # THIS FUNCTION CHANGE FOR THREAD #THREAD ONE for k in range(Nt): Hops += 1 pw = T[k].x % hop_modulo dt[k] = 1 << pw solved = check(T[k], t[k], DP_rarity, "tame.txt", T, t, W, w) if solved: return "sol. time: %.2f sec" % (time.time() - starttime) t[k] += dt[k] T[k] = add(P[pw], T[k]) #THREAD 2 for k in range(Nw): Hops += 1 pw = W[k].x % hop_modulo dw[k] = 1 << pw solved = check(W[k], w[k], DP_rarity, "wild.txt", W, w, T, t) if solved: return "sol. time: %.2f sec" % (time.time() - starttime) w[k] += dw[k] W[k] = add(P[pw], W[k])
# DATA SETS AND IMPORTANT INFORMATION -> THINK ABOUT IT AS MINIMALISED OPERATION.
puzzle = 50 compressed_public_key = ( "03f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6" # Puzzle 50 ) kangoo_power = 10 # For Puzzle 50-56 use 9 to 11, for Puzzle 60-80 use 14 to 16 / 24 cores or above preferred Nt = Nw = 2**kangoo_power
# MOVED FROM SEARCH DEF DP_rarity = 1 << ((puzzle - 2 * kangoo_power) // 2 - 2) hop_modulo = ((puzzle - 1) // 2) + kangoo_power T, t, dt = [], [], [] W, w, dw = [], [], []
for k in range(Nt): t.append((3 << (puzzle - 2)) + random.randint(1, (2 ** (puzzle - 1)))) T.append(mulk(t[k])) dt.append(0) # check format pubkey if len(compressed_public_key) == 66: X = int(compressed_public_key[2:66], 16) # calculation Y from X if pubkey is compressed Y = X2Y(X, gmpy2.mpz(compressed_public_key[:2]) - 2) else: print("[error] pubkey len(66/130) invalid!")
print(f"[Puzzle]: {puzzle}") print("[Xcoordinate]: %064x" % X) print("[Ycoordinate]: %064x" % Y)
W0 = Point(X, Y) starttime = oldtime = time.time()
Hops = 0 random.seed()
hops_list = [] N_tests = kangoo_power
## YOU DONT USE TAME AND WILD IN SCRIPT! SO FOR WHAT IMPLEMENT IT? IT TAKING TIME AND MEMORY """ for k in range(N_tests): # Create empty 'tame.txt' and 'wild.txt' files for each iteration save2file("tame.txt", "w", "") save2file("wild.txt", "w", "") """
def parallel_search(process_count, Nt, Nw, puzzle, kangoo_power, starttime): pool = Pool(process_count) results = pool.starmap( search, [(Nt, Nw, puzzle, kangoo_power, starttime)] * process_count ) pool.close() pool.join() return results
if __name__ == "__main__": process_count = cpu_count() # Use all available CPU cores print(f"Using {process_count} CPU cores for parallel search.") results = parallel_search(process_count, Nt, Nw, puzzle, kangoo_power, starttime) for result in results: print(result)
try now! -> in my solution i have prefoius impelement thread one and thread 2 for functionin search. do it ! ################################################ Pollard-kangaroo PrivKey Recovery Tool multicore ################################################ Sun Sep 10 13:42:36 2023 P-table prepared tame and wild herds kangaroos is being prepared [Puzzle]: 50 [Xcoordinate]: f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6 [Ycoordinate]: eb3dfcc04c320b55c529291478550be6072977c0c86603fb2e4f5283631064fb Using 4 CPU cores for parallel search. SOLVED: Sun Sep 10 13:44:06 2023 total time: 89.33 sec -0000000000000000000000000000000000000000000000000022bd43c2e9354
Thanks. Here is the corrected one. The script was able to find 2**50 on my pc in 90 seconds. import sys import os import time import random import gmpy2 from gmpy2 import mpz from functools import lru_cache import multiprocessing from multiprocessing import Pool, cpu_count
# Constants modulo = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) order = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141) Gx = gmpy2.mpz(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) Gy = gmpy2.mpz(0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y
PG = Point(Gx, Gy) Z = Point(0, 0) # zero-point, infinite in real x,y-plane
def mul2(P, p=modulo): c = (3 * P.x * P.x * pow(2 * P.y, -1, p)) % p R = Point() R.x = (c * c - 2 * P.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
def add(P, Q, p=modulo): dx = Q.x - P.x dy = Q.y - P.y c = dy * gmpy2.invert(dx, p) % p R = Point() R.x = (c * c - P.x - Q.x) % p R.y = (c * (P.x - R.x) - P.y) % p return R
@lru_cache(maxsize=None) def X2Y(X, y_parity, p=modulo): Y = 3 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
X = (tmp + 7) % p
Y = (p + 1) // 4 tmp = 1 while Y: if Y & 1: tmp = tmp * X % p Y >>= 1 X = X * X % p
Y = tmp
if Y % 2 != y_parity: Y = -Y % p
return Y
def compute_P_table(): P = [PG] for k in range(255): P.append(mul2(P[k])) return P
P = compute_P_table()
# Global event to signal all processes to stop stop_event = multiprocessing.Event()
def comparator(A, Ak, B, Bk): global stop_event result = set(A).intersection(set(B))
if result: sol_kt = A.index(next(iter(result))) sol_kw = B.index(next(iter(result))) difference = Ak[sol_kt] - Bk[sol_kw] HEX = "%064x" % difference # Convert to a hexadecimal string t = time.ctime() total_time = time.time() - starttime print("\033[01;33mSOLVED:", t, f"total time: {total_time:.2f} sec", HEX, "\n") with open("KEYFOUNDKEYFOUND.txt", "a") as file: file.write("\n\nSOLVED " + t) file.write(f"\nTotal Time: {total_time:.2f} sec") file.write("\nPrivate Key (decimal): " + str(difference)) file.write("\nPrivate Key (hex): " + HEX) file.write( "\n-------------------------------------------------------------------------------------------------------------------------------------\n" )
stop_event.set() # Set the stop event to signal all processes
def check(P, Pindex, DP_rarity, A, Ak, B, Bk): if P.x % DP_rarity == 0: A.append(P.x) Ak.append(Pindex) # Print the public key message = "\rPublic key: {:064x}".format(P.x) sys.stdout.write("\033[01;33m") sys.stdout.write(message + "\r") sys.stdout.flush() return comparator(A, Ak, B, Bk) else: return False
ecmultiply_memo = {}
def ecmultiply(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: if k in ecmultiply_memo: return ecmultiply_memo[k] else: result = ecmultiply(k // 2, mul2(P, p), p) ecmultiply_memo[k] = result return result else: return add(P, ecmultiply((k - 1) // 2, mul2(P, p), p))
def mulk(k, P=PG, p=modulo): if k == 0: return Z elif k == 1: return P elif k % 2 == 0: return mulk(k // 2, mul2(P, p), p) else: return add(P, mulk((k - 1) // 2, mul2(P, p), p))
def search(Nt, Nw, puzzle, kangoo_power, starttime): global stop_event for k in range(Nt): t.append((3 << (puzzle - 2)) + random.randint(1, (2 ** (puzzle - 1)))) T.append(mulk(t[k])) dt.append(0)
for k in range(Nw): w.append(random.randint(1, (1 << (puzzle - 1)))) W.append(add(W0, mulk(w[k]))) dw.append(0)
Hops, Hops_old = 0, 0
oldtime = time.time() starttime = oldtime while True: for k in range(Nt): Hops += 1 pw = T[k].x % hop_modulo dt[k] = 1 << pw solved = check(T[k], t[k], DP_rarity, T, t, W, w) if solved: stop_event.set() # Set the stop event to signal all processes return "sol. time: %.2f sec" % ( time.time() - starttime ) # Return solution time sys.stdout.write("\033[01;33m") sys.stdout.flush() t[k] += dt[k] T[k] = add(P[pw], T[k])
for k in range(Nw): Hops += 1 pw = W[k].x % hop_modulo dw[k] = 1 << pw solved = check(W[k], w[k], DP_rarity, W, w, T, t) if solved: stop_event.set() # Set the stop event to signal all processes return "sol. time: %.2f sec" % ( time.time() - starttime ) # Return solution time sys.stdout.write("\033[01;33m") sys.stdout.flush() w[k] += dw[k] W[k] = add(P[pw], W[k])
# Check the stop event and exit the loop if it's set if stop_event.is_set(): sys.exit() # Exit the script if a solution is found
# Main script if __name__ == "__main__": os.system("clear") t = time.ctime() sys.stdout.write("\033[01;33m") sys.stdout.write("################################################" + "\n") sys.stdout.write("Pollard-kangaroo PrivKey Recovery Tool multicore" + "\n") sys.stdout.write("################################################" + "\n") sys.stdout.write(t + "\n") sys.stdout.flush()
# Initialize constants and precompute table puzzle = 50 kangoo_power = 10 # For Puzzle 50-56 use 9 to 11, for Puzzle 60-80 use 14 to 16 / 24 cores or above preferred Nt = Nw = 2**kangoo_power DP_rarity = 1 << ((puzzle - 2 * kangoo_power) // 2 - 2) hop_modulo = ((puzzle - 1) // 2) + kangoo_power T, t, dt = [], [], [] W, w, dw = [], [], []
compressed_public_key = "03f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6" # Puzzle 50
if len(compressed_public_key) == 66: X = int(compressed_public_key[2:66], 16) Y = X2Y(X, gmpy2.mpz(compressed_public_key[:2]) - 2) else: print("[error] pubkey len(66/130) invalid!")
print(f"[Puzzle]: {puzzle}") print("[Xcoordinate]: %064x" % X) print("[Ycoordinate]: %064x" % Y)
W0 = Point(X, Y) starttime = oldtime = time.time()
Hops = 0 random.seed()
hops_list = []
process_count = cpu_count() # Use all available CPU cores print(f"Using {process_count} CPU cores for parallel search")
# Perform parallel search pool = Pool(process_count) results = pool.starmap( search, [(Nt, Nw, puzzle, kangoo_power, starttime)] * process_count ) pool.close() pool.join()
for result in results: print(result)
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
nomachine
|
 |
September 10, 2023, 05:57:16 PM Last edit: September 22, 2023, 01:24:10 PM by nomachine |
|
if this part of code: while True: for k in range(Nt): Hops += 1 pw = T[k].x % hop_modulo dt[k] = 1 << pw solved = check(T[k], t[k], DP_rarity, T, t, W, w) if solved: stop_event.set() # Set the stop event to signal all processes return "sol. time: %.2f sec" % ( time.time() - starttime ) # Return solution time sys.stdout.write("\033[01;33m") sys.stdout.flush() t[k] += dt[k] T[k] = add(P[pw], T[k])
for k in range(Nw): Hops += 1 pw = W[k].x % hop_modulo dw[k] = 1 << pw solved = check(W[k], w[k], DP_rarity, W, w, T, t) if solved: stop_event.set() # Set the stop event to signal all processes return "sol. time: %.2f sec" % ( time.time() - starttime ) # Return solution time sys.stdout.write("\033[01;33m") sys.stdout.flush() w[k] += dw[k] W[k] = add(P[pw], W[k])
you change for additional thread or multicore -> will be faster about 20-25 s I have a better idea. TO insert all calculations and search in @numba.jit....To use Numba to compile the performance-critical parts of code into machine code, which can significantly speed up computation. p.s. def add_numba(P, Q, p=modulo): <source elided> @njit ^ This error may have been caused by the following argument(s): - argument 0: Int value is too large: 110560903758971929709743161563183868968201998016819862389797221564458485814982 - argument 2: Int value is too large: 115792089237316195423570985008687907853269984665640564039457584007908834671663 Numba does not support big int. It is essentially limited to integer types that are supported by numpy. The max integer width is currently limited to 64-bit.  GMP is the best option for now. Update : import sys import os import time import gmpy2 from gmpy2 import mpz from functools import lru_cache import secp256k1 as ice import multiprocessing from multiprocessing import Pool, cpu_count
# Constants MODULO = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) ORDER = gmpy2.mpz(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141) GX = gmpy2.mpz(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) GY = gmpy2.mpz(0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
# Define Point class class Point: def __init__(self, x=0, y=0): self.x = x self.y = y
PG = Point(GX, GY) ZERO_POINT = Point(0, 0)
# Function to multiply a point by 2 def multiply_by_2(P, p=MODULO): c = gmpy2.f_mod(3 * P.x * P.x * gmpy2.powmod(2 * P.y, -1, p), p) R = Point() R.x = gmpy2.f_mod(c * c - 2 * P.x, p) R.y = gmpy2.f_mod(c * (P.x - R.x) - P.y, p) return R
# Function to add two points def add_points(P, Q, p=MODULO): dx = Q.x - P.x dy = Q.y - P.y c = gmpy2.f_mod(dy * gmpy2.invert(dx, p), p) R = Point() R.x = gmpy2.f_mod(c * c - P.x - Q.x, p) R.y = gmpy2.f_mod(c * (P.x - R.x) - P.y, p) return R
# Function to calculate Y-coordinate from X-coordinate @lru_cache(maxsize=None) def x_to_y(X, y_parity, p=MODULO): Y = gmpy2.mpz(3) tmp = gmpy2.mpz(1)
while Y > 0: if Y % 2 == 1: tmp = gmpy2.f_mod(tmp * X, p) Y >>= 1 X = gmpy2.f_mod(X * X, p)
X = gmpy2.f_mod(tmp + 7, p)
Y = gmpy2.f_div(gmpy2.add(p, 1), 4) tmp = gmpy2.mpz(1)
while Y > 0: if Y % 2 == 1: tmp = gmpy2.f_mod(tmp * X, p) Y >>= 1 X = gmpy2.f_mod(X * X, p)
Y = tmp
if Y % 2 != y_parity: Y = gmpy2.f_mod(-Y, p)
return Y
# Function to compute a table of points def compute_point_table(): points = [PG] for k in range(255): points.append(multiply_by_2(points[k])) return points
POINTS_TABLE = compute_point_table()
# Global event to signal all processes to stop STOP_EVENT = multiprocessing.Event()
# Function to check and compare points for potential solutions def check(P, Pindex, DP_rarity, A, Ak, B, Bk): check = gmpy2.f_mod(P.x, DP_rarity) if check == 0: message = f"\r[+] [Pindex]: {mpz(Pindex)}" messages = [] messages.append(message) output = "\033[01;33m" + ''.join(messages) + "\r" sys.stdout.write(output) sys.stdout.flush() A.append(mpz(P.x)) Ak.append(mpz(Pindex)) return comparator(A, Ak, B, Bk) else: return False
# Function to compare two sets of points and find a common point def comparator(A, Ak, B, Bk): global STOP_EVENT result = set(A).intersection(set(B)) if result: sol_kt = A.index(next(iter(result))) sol_kw = B.index(next(iter(result))) difference = Ak[sol_kt] - Bk[sol_kw] HEX = "%064x" % difference wifc = ice.btc_pvk_to_wif("%064x" % mpz(difference)) dec = int(ice.btc_wif_to_pvk_hex(wifc), 16) wifu = ice.btc_pvk_to_wif(HEX, False) # Uncompressed uaddr = ice.privatekey_to_address(0, False, dec) # Uncompressed caddr = ice.privatekey_to_address(0, True, dec) # Compressed HASH160 = ice.privatekey_to_h160(0, True, dec).hex() t = time.ctime() total_time = time.time() - starttime print(f"\033[32m[+] PUZZLE SOLVED: {t}, total time: {total_time:.2f} sec \033[0m") print(f"\033[32m[+] WIF: \033[32m {wifc} \033[0m") with open("KEYFOUNDKEYFOUND.txt", "a") as file: file.write("\n\nPUZZLE SOLVED " + t) file.write(f"\nTotal Time: {total_time:.2f} sec") file.write('\nPrivate Key (dec): ' + str(dec)) file.write('\nPrivate Key (hex): ' + HEX) file.write('\nPrivate Key Compressed: ' + wifc) file.write('\nPrivate Key Uncompressed: ' + wifu) file.write('\nPublic Address Compressed: ' + caddr) file.write('\nPublic Address Uncompressed: ' + uaddr) file.write('\nPublic Key Hash Compressed (Hash 160): ' + HASH160) file.write( "\n-------------------------------------------------------------------------------------------------------------------------------------\n" )
STOP_EVENT.set() # Set the stop event to signal all processes
# Memoization for point multiplication ECMULTIPLY_MEMO = {}
# Function to multiply a point by a scalar def ecmultiply(k, P=PG, p=MODULO): if k == 0: return ZERO_POINT elif k == 1: return P elif k % 2 == 0: if k in ECMULTIPLY_MEMO: return ECMULTIPLY_MEMO[k] else: result = ecmultiply(k // 2, multiply_by_2(P, p), p) ECMULTIPLY_MEMO[k] = result return result else: return add_points(P, ecmultiply((k - 1) // 2, multiply_by_2(P, p), p))
# Recursive function to multiply a point by a scalar def mulk(k, P=PG, p=MODULO): if k == 0: return ZERO_POINT elif k == 1: return P elif k % 2 == 0: return mulk(k // 2, multiply_by_2(P, p), p) else: return add_points(P, mulk((k - 1) // 2, multiply_by_2(P, p), p))
# Generate a list of powers of two for faster access @lru_cache(maxsize=None) def generate_powers_of_two(hop_modulo): return [mpz(1 << pw) for pw in range(hop_modulo)]
# Worker function for point search def search_worker( Nt, Nw, puzzle, kangaroo_power, starttime, lower_range_limit, upper_range_limit ): global STOP_EVENT
# Precompute random values random_state_t = gmpy2.random_state(hash(gmpy2.random_state())) random_state_w = gmpy2.random_state(hash(gmpy2.random_state()))
t = [ mpz(lower_range_limit + mpz(gmpy2.mpz_random(random_state_t, upper_range_limit - lower_range_limit))) for _ in range(Nt) ] T = [mulk(ti) for ti in t] dt = [mpz(0) for _ in range(Nt)] w = [ mpz(gmpy2.mpz_random(random_state_w, upper_range_limit - lower_range_limit)) for _ in range(Nt) ] W = [add_points(W0, mulk(wk)) for wk in w] dw = [mpz(0) for _ in range(Nw)]
Hops, Hops_old = 0, 0
oldtime = time.time() starttime = oldtime
while True: for k in range(Nt): Hops += 1 pw = T[k].x % hop_modulo dt[k] = powers_of_two[pw] solved = check(T[k], t[k], DP_rarity, T, t, W, w) if solved: STOP_EVENT.set() raise SystemExit t[k] = mpz(t[k]) + dt[k] # Use mpz here T[k] = add_points(POINTS_TABLE[pw], T[k])
for k in range(Nw): Hops += 1 pw = W[k].x % hop_modulo dw[k] = powers_of_two[pw] solved = check(W[k], w[k], DP_rarity, W, w, T, t) if solved: STOP_EVENT.set() raise SystemExit w[k] = mpz(w[k]) + dw[k] # Use mpz here W[k] = add_points(POINTS_TABLE[pw], W[k])
if STOP_EVENT.is_set(): break
# Main script if __name__ == "__main__": os.system("clear") t = time.ctime() sys.stdout.write("\033[01;33m") sys.stdout.write(f"[+] {t}" + "\n") sys.stdout.flush() # Configuration for the puzzle puzzle = 50 compressed_public_key = "03f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6" # Puzzle 50 kangaroo_power = 10 # For Puzzle 50-56 use 9 to 11, for Puzzle 60-80 use 14 to 16 / 24 cores or above preferred lower_range_limit = 2 ** (puzzle - 1) upper_range_limit = (2**puzzle) - 1
Nt = Nw = 2**kangaroo_power DP_rarity = 1 << ((puzzle - 2 * kangaroo_power) // 2 - 2) hop_modulo = ((puzzle - 1) // 2) + kangaroo_power
# Precompute powers of two for faster access powers_of_two = generate_powers_of_two(hop_modulo)
T, t, dt = [], [], [] W, w, dw = [], [], []
if len(compressed_public_key) == 66: X = mpz(compressed_public_key[2:66], 16) Y = x_to_y(X, mpz(compressed_public_key[:2]) - 2) else: print("[error] pubkey len(66/130) invalid!")
print(f"[+] [Puzzle]: {puzzle}") print(f"[+] [Lower range limit]: {lower_range_limit}") print(f"[+] [Upper range limit]: {upper_range_limit}") print("[+] [Xcoordinate]: %064x" % X) print("[+] [Ycoordinate]: %064x" % Y)
W0 = Point(X, Y) starttime = oldtime = time.time()
Hops = 0
process_count = cpu_count() print(f"[+] Using {process_count} CPU cores for parallel search")
# Create a pool of worker processes pool = Pool(process_count) results = pool.starmap( search_worker, [ ( Nt, Nw, puzzle, kangaroo_power, starttime, lower_range_limit, upper_range_limit, ) ] * process_count, ) pool.close() pool.join()
- Pollard-kangaroo PrivKey Recovery Tool multicore
- Mon Sep 11 12:15:07 2023
- [Puzzle]: 50
- [Xcoordinate]: f46f41027bbf44fafd6b059091b900dad41e6845b2241dc3254c7cdd3c5a16c6
- [Ycoordinate]: eb3dfcc04c320b55c529291478550be6072977c0c86603fb2e4f5283631064fb
- Using 4 CPU cores for parallel search
SOLVED: Mon Sep 11 12:15:34 2023 total time: 26.36 sec -0000000000000000000000000000000000000000000000000022bd43c2e9354 This is my personal record with Python. 
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
tifosi87
Newbie
Offline
Activity: 4
Merit: 0
|
 |
September 22, 2023, 09:56:06 AM |
|
is there a way for search y coordinate square modulo p
|
|
|
|
digaran
Copper Member
Hero Member
   
Offline
Activity: 1330
Merit: 903
🖤😏
|
 |
September 22, 2023, 12:47:16 PM |
|
is there a way for search y coordinate square modulo p
Why would you want that? Imagine you are searching for y coordinates. Example : X= 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 Y= 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 Private key= 0x1
X= 0xbcace2e99da01887ab0102b696902325872844067f15e98da7bba04400b88fcb Y= 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 Private key= 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72
X= 0xc994b69768832bcbff5e9ab39ae8d1d3763bbf1e531bed98fe51de5ee84f50fb Y= 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 Private key= 0xac9c52b33fa3cf1f5ad9e3fd77ed9ba4a880b9fc8ec739c2e0cfc810b51283ce They all have the same y coordinates, are you sure you want to search for them?
|
🖤😏
|
|
|
CY4NiDE
Member

Offline
Activity: 65
Merit: 40
|
 |
October 06, 2023, 07:42:55 PM |
|
understood. Thank you for clarification @ecdsa123 I just ran a successful test with a 129bit key and it worked like a charm.
One more question related to Kangaroo program. Let's say I run Kangaroo and search for a 145bit key. I run it for 1 hour and then quit it because no key was found. Then I re-execute exactly the same command. Will the program iterate through the same values as it did on run first or is it theoretically possible that the 2nd run will find a key? My question basically is: does it behave like VanitySearch where it's theoretically possible to find a match each second regardless of what happened in the history and which range was scanned. Or does it behave more like BitCrack which searches in linear mode ?
I have the same doubt!
|
1CY4NiDEaNXfhZ3ndgC2M2sPnrkRhAZhmS
|
|
|
citb0in
|
 |
October 07, 2023, 11:18:50 AM |
|
One more question related to Kangaroo program. Let's say I run Kangaroo and search for a 145bit key. I run it for 1 hour and then quit it because no key was found. Then I re-execute exactly the same command. Will the program iterate through the same values as it did on run first or is it theoretically possible that the 2nd run will find a key? My question basically is: does it behave like VanitySearch where it's theoretically possible to find a match each second regardless of what happened in the history and which range was scanned. Or does it behave more like BitCrack which searches in linear mode ?
Answer: You are right. Pollard rho will not iterate the same values. it means that second or third run command maybe will find the key, Thanks for your kind feedback.
|
Some signs are invisible, some paths are hidden - but those who see, know what to do. Follow the trail - Follow your intuition - [bc1qqnrjshpjpypepxvuagatsqqemnyetsmvzqnafh]
|
|
|
digaran
Copper Member
Hero Member
   
Offline
Activity: 1330
Merit: 903
🖤😏
|
 |
October 07, 2023, 12:38:17 PM |
|
Pollard rho will not iterate the same values. it means that second or third run command maybe will find the key,
Wait, what do you mean by this? You mean when we use kangaroo it will change searching methods? Or you mean when we set a different search range?
|
🖤😏
|
|
|
citb0in
|
 |
October 07, 2023, 12:54:11 PM |
|
Pollard rho will not iterate the same values. it means that second or third run command maybe will find the key,
Wait, what do you mean by this? You mean when we use kangaroo it will change searching methods? Or you mean when we set a different search range? come on, such question from such a guy - really ? what's next ?
|
Some signs are invisible, some paths are hidden - but those who see, know what to do. Follow the trail - Follow your intuition - [bc1qqnrjshpjpypepxvuagatsqqemnyetsmvzqnafh]
|
|
|
digaran
Copper Member
Hero Member
   
Offline
Activity: 1330
Merit: 903
🖤😏
|
 |
October 07, 2023, 01:07:05 PM |
|
Can you please be less obvious about your hurt feelings and stay on topic @citb0in? I have no experience in coding, so I can't understand even if I read the code, hence the reason for my question. There is no shame in asking questions to learn new things.
|
🖤😏
|
|
|
EternityMessage
Newbie
Offline
Activity: 15
Merit: 0
|
 |
October 07, 2023, 08:44:40 PM |
|
Hello fellow puzzle solvers, After spending really too much time of my life trying different code and algorithms, buying and running loud hot hardware to solve #66 & #130I started to wander about ethics of what I am trying to do ! OK, if I have a really really good luck, I will find the key after 1-2 more years! ... BUT !!! Do I have the right to take the coins in the address? ... The coins (the money) are not mine, and the owner (the assumed puzzle creator) never said that, if I brake the private key, I have the right to take the money !!! (Also the fact that the person has more money than us, does not give us the right to take his money!) So .. did I spent so much time of my life trying to become a thief? ... The assumption when I started was ... That is a challenge .. I can do my best .. BUT Do I have the moral right to get money assuming it is by the rules ? ... There are no official rules? We conveniently assume the owner intentions and are ready to get his money ... but what if we are wrong?
|
|
|
|
digaran
Copper Member
Hero Member
   
Offline
Activity: 1330
Merit: 903
🖤😏
|
 |
October 07, 2023, 10:41:26 PM |
|
Hello fellow puzzle solvers, After spending really too much time of my life trying different code and algorithms, buying and running loud hot hardware to solve #66 & #130I started to wander about ethics of what I am trying to do ! OK, if I have a really really good luck, I will find the key after 1-2 more years! ... BUT !!! Do I have the right to take the coins in the address? ... The coins (the money) are not mine, and the owner (the assumed puzzle creator) never said that, if I brake the private key, I have the right to take the money !!! (Also the fact that the person has more money than us, does not give us the right to take his money!) So .. did I spent so much time of my life trying to become a thief? ... The assumption when I started was ... That is a challenge .. I can do my best .. BUT Do I have the moral right to get money assuming it is by the rules ? ... There are no official rules? We conveniently assume the owner intentions and are ready to get his money ... but what if we are wrong?
Tell me something, when you find the puzzle key and transfer it to your address, who is going to say you weren't the real owner? The rules in crypto are different, when you hold a private key by the law you are the owner, ethically? If it's for someone else, you should never touch them, but when someone intentionally sends bitcoins to 160 addresses starting from 1, it means they are dropping bread crumbs along the way as a beacon to signal those capable to take them if they can, to what end? To see how fast they can take it. Now since finding a key even in lowest ranges is not an easy task, the person who finds it, can keep it as a bounty prize. More importantly, solving them requires fast tools, and not everyone is able to develop such programs, so when they do and use it to find a key, they take the coins as their reward. You might wonder, but why?? Because paying $30M to make sure +$600B is safe is a good deal. Now where are those 600B? They reside in 255+ bit range, where are puzzle keys 30M? They reside from 66 bit up to 160 bit. To realize how big that gap is, you'd need to multiply 2^160 by 2^96 to reach there. The designer doesn't need to say anything, he already said thanks to those who were developing cracking tools, also a few month ago, he increased the prize 10x folds after community's request. Unless he is mentally happy (lol) I would doubt he would add more to the pot after #125 was solved if he wanted the coins for himself.
|
🖤😏
|
|
|
EternityMessage
Newbie
Offline
Activity: 15
Merit: 0
|
 |
October 08, 2023, 06:26:15 AM |
|
Hello again,
About: "The rules in crypto are different, when you hold a private key by the law you are the owner" What if money were yours? Still OK with this?
"The designer ... increased the prize 10x folds after community's request." OK! Time for another community's request: Mr./Mrs. Puzzle creator and puzzle addresses money owner, Please sign a message with any known non-broken puzzle address, and state your will! Are you fine, if money from these addresses are taken?" Or "you consider us thieves?" or ... (the signing #150, #155... public keys are already known and will not compromise security)
Thanks
|
|
|
|
CY4NiDE
Member

Offline
Activity: 65
Merit: 40
|
 |
October 08, 2023, 07:31:22 AM |
|
So I'm messing with Puzzle #130 and JLP's Pollard Kangaroo ECDLP Solver using a RTX 2070. When I first launch it, this is the speed I get: [1553.87 MK/s][GPU 1459.12 MK/s] After a few seconds running at that speed it will slowly decrease until it reaches this speed, where it stays for the rest of the operation: [1209.19 MK/s][GPU 1134.42 MK/s] Does anyone know why this is happening? Thanks in advance! 
|
1CY4NiDEaNXfhZ3ndgC2M2sPnrkRhAZhmS
|
|
|
_Counselor
Member

Offline
Activity: 111
Merit: 61
|
 |
October 08, 2023, 07:40:54 AM |
|
So I'm messing with Puzzle #130 and JLP's Pollard Kangaroo ECDLP Solver using a RTX 2070. When I first launch it, this is the speed I get: [1553.87 MK/s][GPU 1459.12 MK/s] After a few seconds running at that speed it will slowly decrease until it reaches this speed, where it stays for the rest of the operation: [1209.19 MK/s][GPU 1134.42 MK/s] Does anyone know why this is happening? Thanks in advance!  Because statistics are wrong until all threads loads kangaroos. Wait about 10-15 seconds to get right numbers.
|
|
|
|
digaran
Copper Member
Hero Member
   
Offline
Activity: 1330
Merit: 903
🖤😏
|
 |
October 08, 2023, 10:26:29 AM |
|
Hello again,
About: "The rules in crypto are different, when you hold a private key by the law you are the owner" What if money were yours? Still OK with this?
"The designer ... increased the prize 10x folds after community's request." OK! Time for another community's request: Mr./Mrs. Puzzle creator and puzzle addresses money owner, Please sign a message with any known non-broken puzzle address, and state your will! Are you fine, if money from these addresses are taken?" Or "you consider us thieves?" or ... (the signing #150, #155... public keys are already known and will not compromise security)
Thanks
You should talk about it over there in puzzle thread, even though kangaroo was developed for these puzzles but it would be more or less off topic especially since OP is not active to provide any insights of morality standards. This would be my last reply regarding your concerns, why would he send more Bitcoins to those addresses if he wanted them untouched? Moreover did you even read his post from 2019?
|
🖤😏
|
|
|
CY4NiDE
Member

Offline
Activity: 65
Merit: 40
|
 |
October 09, 2023, 03:00:51 AM |
|
So I'm messing with Puzzle #130 and JLP's Pollard Kangaroo ECDLP Solver using a RTX 2070. When I first launch it, this is the speed I get: [1553.87 MK/s][GPU 1459.12 MK/s] After a few seconds running at that speed it will slowly decrease until it reaches this speed, where it stays for the rest of the operation: [1209.19 MK/s][GPU 1134.42 MK/s] Does anyone know why this is happening? Thanks in advance!  Because statistics are wrong until all threads loads kangaroos. Wait about 10-15 seconds to get right numbers. Oh, this makes total sense. Thank you for your quick and concise answer! 
|
1CY4NiDEaNXfhZ3ndgC2M2sPnrkRhAZhmS
|
|
|
|