- Zacznijmy może od tego
c1 = str (random.choice("1"))
choice() ze stringa też zwróci ci stringa, także to rzutowanie jest tam zbędne.
Sprawa druga - po cóż robisz tam randoma z jednoznakowego stringa - przecież zawsze będzie on taki sam - '1'.
Więc ta linijka jest kompletnie zbędna i można by ją zastąpić po prostu:
c1 = '1'
- Następna rzecz:
b1 = "01111111111111111111111111111111111111111111111111111111" # pierwszy zestaw mieszania (kombinacje jednego zera i 55x jedynek)
b2 = "00111111111111111111111111111111111111111111111111111111" # drugi zestaw mieszania itd....
b3 = "00011111111111111111111111111111111111111111111111111111"
b4 = "00001111111111111111111111111111111111111111111111111111"
b5 = "00000111111111111111111111111111111111111111111111111111"
b6 = "00000011111111111111111111111111111111111111111111111111"
b7 = "00000001111111111111111111111111111111111111111111111111"
b8 = "00000000111111111111111111111111111111111111111111111111"
b9 = "00000000011111111111111111111111111111111111111111111111"
#xx = "0000000000000000000000000000000000000000000000001"
mam nadzieję, że ręcznie tego nie pisałeś...
zastąpmy to następującym kodem:
sets_length = 56
mix_sets = ["0"*i+"1"*(sets_length-i) for i in range(sets_length)]
Czy też może w tym wypadku jaśniej by było:
import itertools
sets_length = 56
mix_sets = list(itertools.combinations_with_replacement('01', sets_length))
Jeśli chcesz tylko pierwsze 9 elementów, to cyk:
first_9_mix_sets = mix_sets[:9]
Chociaż ten kod i tak jest zbędny moim zdaniem, bo
Z tego, co rozumiem dalej:
for spisok in range(1000):
s = element
d = ''.join(random.sample(s,len(s)))
To wychodzi na to, że tak w rzeczywistości masz jakiś tam klucz o długości 56 bitów.
Może on zawierać dowolną liczbę zer lub jedynek w dowolnej kolejności. I teraz na podstawie takiego klucza chcesz odgadywać inny klucz?
Ja przynajmniej mniej więcej tak rozumiem twój kod.
Jeśli tak jest, to nie mam dobrych wiadomości, bo wtedy masz 2^56 możliwości do sprawdzenia, więc powodzenia.
Ale by wyświetlić progres, możesz zasugerować się czymś takim:
import itertools
for index, element in enumerate(itertools.product('01', 56)):
d = ''.join(random.sample(element,len(element)))
bina = (c1+d)
b = int(c1+d,2)
key = Key.from_int(b)
addr = key.address
if addr == "1HBAiS8FKAeBVNubKApKM1pFamT5RKojP2": # przykładowa wartość do której szukam właściwego ciągu
print ("found!!!",b,addr)
s1 = str(b)
s2 = addr
f=open(u"C:/a.txt","a")
f.write(s1)
f.write(s2)
f.close()
break
print(f'progress: {index/(2**56)*100}%')
Przy czym ten kod będzie się wykonywał wieki.
W innym wypadku, podaj proszę może więcej szczegółów co do tego, co ma robić twój kod.
Ten skrypt nie działa pod Pythonem 3.7.2:
import random
import itertools
from bit import *
from PyRandLib import *
rand = FastRand63()
random.seed(rand())
import itertools
sets_length = 56
mix_sets = list(itertools.combinations_with_replacement('01', sets_length))
for spisok in range(1000):
s = element
d = ''.join(random.sample(s,len(s)))
for index, element in enumerate(itertools.product('01', 56)):
d = ''.join(random.sample(element,len(element)))
bina = (c1+d)
b = int(c1+d,2)
key = Key.from_int(b)
addr = key.address
if addr == "1HBAiS8FKAeBVNubKApKM1pFamT5RKojP2":
print ("found!!!",b,addr)
s1 = str(b)
s2 = addr
f=open(u"C:/a.txt","a")
f.write(s1)
f.write(s2)
f.close()
break
print(f'progress: {index/(2**56)*100}%')
Ciągle wyrzuca mi syntax error lub 'int' is not iterable
Dokładniej rzecz ujmując mam do znalezienia w ramach rozwiazania zagadki trzy klucze do adresów którego przykład podałem (1HBAiS8FKAeBVNubKApKM1pFamT5RKojP2) . Przeliczanie całych zakresów na pewno trwaloby wieki, ale ze mam podany konkretny zakres przedziałów DEC i mam an tyle sprzętu aby za kazdym odpalić wbrany - mniejszy zakres - że mogę się tego podjąć :-)
Jako że DOŁĄCZAM do zagadki ktora juz miala wczesniej rozwiazane kolejne kroki, wiem też że kolejny zakres zwieksza sie i jeden "keyspace" i tak oto BIN dla ostatnich rozwiazan wygladal nastepujaca:
0000 0000 0010 0011 0110 1111 1011 0110 1101 0101 1010 1101 0001 1111 0100 0110
0000 0000 0110 1010 1011 1110 0001 1111 1001 1011 0110 0111 1110 0001 0001 0100
0000 0000 1001 1101 0001 1000 1011 0110 0011 1010 1100 0100 1111 1111 1101 1111
0000 0001 1110 1011 0010 0101 1100 1001 0000 0111 1001 0101 1101 0110 0001 1100
0000 0010 1100 0110 0111 0101 1011 1000 0101 0010 0001 1000 1001 1010 0010 0001
więc nastpne rozwiązania będą miały rozwiązanie w zakresach kolejno:
0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx #58
0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx #59
0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx #60
Widać więc skąd wynika stała wartość c1 = '1' (rozwiązania będą z przestrzeni 58, 59 i 60 i zaczynały od "1" w binarnej formie)
Stąd też dla mnie istotne jest stałe "1" , możliwość regulowania ilości zer i jedynek w rozwiazaniu oraz sprawdzenie kazdej opcji [ na kazdej maszynie ustawie inny stosunek zer do jedynek i kazda bedzie sprawdzala osobne przedzialy ]. Nie bez powodu też używany jest moduł "bit" który jest nieco bardziej sprawny w stosunku do konkurentów.
Bardzo dziękuję za pomoc już dotychczasową ... bardzo duży wkład widzę autora odpowiedzi :-) dziękuję z całych sił za to!