Zaprojektowałem prosty generator losowy, który cyklicznie zamienia dwie liczby za pomocą metody mnożenia i modułu. Działa to doskonale.
Gdybym użył go jako generatora szyfrów, byłby jednak podatny na znany atak w postaci tekstu jawnego, biorąc pod uwagę, że osoba atakująca może odwrócić inżynierowanie ziarna od szeregu liczb losowych w sposób efektywny obliczeniowo.
Aby udowodnić, że złamano szyfr, znajdź legalną parę wartości początkowych, które generują 7 zer w rzędzie w zakresie [0; 255], zużywając jak najmniej energii, czasu procesora itp., Jak to możliwe.
Oto losowy generator napisany w JavaScript:
function seed(state1,state2){
//Constants
var mod1=4294967087
var mul1=65539
var mod2=4294965887
var mul2=65537
function random(limit){
//Cycle each state variable 1 step
state1=(state1*mul1)%mod1
state2=(state2*mul2)%mod2
//Return a random variable
return (state1+state2)%limit
}
//Return the random function
return random
}
//Initiate the random generator using 2 integer values,
//they must be in the ranges [1;4294967086] and [1;4294965886]
random=seed(31337,42)
//Write 7 random values in the range [0;255] to screen
for(a=0;a<7;a++){
document.write(random(256)+"<br>")
}
Stworzyłem narzędzie do testowania par numerów kandydatów, można je znaleźć tutaj .
Przez następne 3 dni spoilery nie są dozwolone , odpowiedź musi zawierać tylko zestaw liczb, i oczywiście powinien być inny zestaw niż te publikowane przez poprzednie solwery. Następnie zachęcamy do pisania kodu i wyjaśnienia swojego podejścia.
Edycja, kwarantanna się zakończyła:
odpowiedzi powinny zawierać zarówno unikalny zestaw liczb, jak i objaśnienie oraz kod dokumentujący metodę rozwiązywania.
Najbardziej eleganckie rozwiązanie wygrywa.
Dla przypomnienia: napisanie
programu, który szybko znajdzie rozwiązanie, jest eleganckie.
Tworzenie programu, który efektywnie wykorzystuje funkcje GPU, aby zrobić to jeszcze szybciej, jest eleganckie.
Wykonanie pracy na „muzealnym sprzęcie” jest eleganckie.
Znalezienie metody rozwiązania, która może być wykorzystana tylko za pomocą długopisu i papieru, jest bardzo eleganckie.
Wyjaśnienie rozwiązania w pouczający i łatwo zrozumiały sposób jest eleganckie.
Korzystanie z wielu lub bardzo drogich komputerów jest nieeleganckie.
źródło
Odpowiedzi:
C ++, 44014022/164607120
Jest w C ++, zużywa 1 GB pamięci i znalezienie pierwszej pary zajęło około 45 sekund. Zaktualizuję czas, gdy znajdzie je wszystkie.
Kod poniżej. Najpierw znajduje wszystkie pary, które generują 4 zera, a następnie zmniejsza je za pomocą prostej próby (patrz
check
metoda). Znajduje pary, które generują 4 zera, generując dwie duże tablice, z których jedna zawiera pierwsze 4 bajty niskiego rzędu generatora state1, a druga zawiera ujemną liczbę pierwszych 4 bajtów niskiego rzędu generatora state2. Te tablice są następnie sortowane i wyszukiwane w celu znalezienia dopasowania, które odpowiada ogólnemu generatorowi wysyłającemu 4 zera na start.Tablice są zbyt duże, aby zapisać je w pamięci, więc działa w partiach o rozmiarze dopasowanym do pamięci.
Wygląda na to, że pełny przebieg zajmie ~ 12 godzin.
Edycja : Poprawiony kod, więc uzyskanie wszystkich możliwych nasion zajmuje tylko ~ 1 godzinę. Teraz generuje tabele w 256 różnych plikach, po jednym dla każdego pierwszego bajtu wyniku. Następnie możemy przetwarzać każdy plik niezależnie, więc nie musimy ponownie generować danych.
Edycja : Okazuje się, że możesz wygenerować 256 podtabel indywidualnie zamiast wszystkich naraz, więc nie potrzebujesz dysku. Czas pracy do ~ 15 minut przy 256 MB.
źródło