liczby LOSOWE

0

Jesteście obeznani z bibliotekami i funkcjami. Chciałbym zapytać czy do dnia dzisiejszego powstał jakiś algorytm który potrafi losować liczby prawdziwie losowe ? (nie chodzi mi o pseudolosowość w funkcji rand())

4

To co piszesz to oksymoron. Algorytm to powtarzalny zestaw kroków pozwalający uzyskać zawsze taki sam efekt dla takich samych warunków początkowych. Jeśli chcesz nieprzewidywalne liczby losowe to musisz opierać się na generatorach liczb losowych opartych na procesach fizycznych, których nie umiemy odtworzyć.

0

to znaczy, że przy obecnej technice nie jesteśmy w stanie wygenerować prawdziwej losowości ? Więc w takim razie jak napisać kod do generowania kluczy licencyjnych ? Widziałem gotowe rozwiązanie ale niestety nie jestem dobry z kryptografii aby samemu zaimplementować chociażby namiastkę czegoś co nie będzie się powtarzać. No chyba, że ktoś z was podrzuci jakiś wzór matematyczny na te sprawy

0

Mam wrażenie że pytasz o coś innego niż wynika z pytania. Nie da się wygenerować algorytmicznie liczb prawdziwie losowych. Możemy założyć, że możesz dostać je z otoczenia i na ich podstawie wygenerować więcej za pomocą CSPRNG, i zakładam, że to właśnie o CSPRNG pytasz. Czyli algorytmy generowania kryptograficznie bezpiecznych liczb pseudolosowych. Ale początkową "rzeczywistą" losowość musisz skądś wziąć, i jeśli ktoś inny będzie mógł ją odtworzyć to cały algorytm psu na budę.

1

Przy obecnej technice można mieć dobrą pseudolosowość, ale zawsze będzie ona w jakikolwiek sposób przewidywalna. Ale pisząc bez filozofii, losowanie piosenek na liście w Foobarze. Działą to tak, że nie ważne jakiego algorytmu użyjesz, raz odtworzona piosenka nie może się powtórzyć. No i ten warunek czyni algorytm przewidywalnym, więc to nie są liczby losowe. W każdym algorytmie na procesory typu x64 czy ARM masz masę warunków, które ograniczają zakres wylosowanych liczb. Kiedy rzucasz kostką, możesz rzucać w dowolny sposób i nikt tego nie nadzoruje.

0

Zdefiniuj, co rozumiesz przez "prawdziwie losowe".

Obowiązkowy mem :) https://imgur.com/bwFWMqQ

0
  1. Jak się wyrabia(ło) klucz do PGP, się lata(ło) myszką po ekranie przez 30-60sek.

  2. obiło mi się o uszy, że tam gdzie to naprawdę ważne, są hardwarowe karty z analogowym szumem
    Typowy pecet nie ma elementów niedeterministycznych

  3. myślę że powtórzenie odczytów longa z losowego adresu, i to wsadzenie do randoma 2-3 razy da taką niepowtarzalność, ze nikomu nie będzie się opłacało hackować tej licencji

  4. skoro są algorytmy szyfrowania łamalne przez lata CPU, to chyba nie masz problemu?

0

Na Stack Overflow czytałem, że w środowisku produkcyjnym nie zalecają używania rand() tylko random_device co wy na to ?

0

U nas też byś to przeczytał, tylko że nam odpisujesz, że nie interesują cię standardy. Ani rand(), ani random_device nie nadają się do kryptografii.

0
AnyKtokolwiek napisał(a):
  1. Jak się wyrabia(ło) klucz do PGP, się lata(ło) myszką po ekranie przez 30-60sek.

to wiem, chciałem się tego nauczyć robić ale to przewyższa moje kompetencje... więc nie wiem jak to osiągnąć. No chyba, że jest jakaś biblioteka która robi takie coś ?

  1. myślę że powtórzenie odczytów longa z losowego adresu

możesz rozwinąć to jaśniej ? Bo nie rozumiem

1
zkubinski napisał(a):
AnyKtokolwiek napisał(a):
  1. Jak się wyrabia(ło) klucz do PGP, się lata(ło) myszką po ekranie przez 30-60sek.

to wiem, chciałem się tego nauczyć robić ale to przewyższa moje kompetencje... więc nie wiem jak to osiągnąć. No chyba, że jest jakaś biblioteka która robi takie coś ?

Robisz aplikację C++ w Qt, w konsoli, w GTK, czy jaka biblioteka? Jeżeli jakaś biblioteka GUI, to na ogół masz możliwe dwie rzeczy:

  1. Na oknie wstawiasz panel, ramkę lub podobną kontrolkę i na nim masz zdarzenie "MouseMove" lub podobne. W zdarzeniu zapamiętujesz gdzieś bieżące położenie myszki na tle tego panela (zwykle zdarzenie MouseMove przekazuje współrzędne kursora myszki).
  2. Dodajesz timer, który wyzwala zdarzenie co 200-500 milisekund. W procedurze zdarzenia odczytujesz bieżące współrzędne myszki i zapisujesz np. w tablicy lub na liście, które przeliczasz na pojedynczą wartość. Najprościej potraktować panel jako szachownicę o polach wielkości piksela, w której w zależności od piksela, na którym jest kursor, otrzymasz wartość 0 lub 1 (masz 50% prawdopodobieństwa każdej wartości). Aby przyspieszyć proces, możesz w przeliczeniu traktować panel jako układ czwórek pikseli w kwadracie, wtedy wynikowa wartość jest od 0 do 3 i masz 25% prawdopodobieństwa trafienia na każdą z nich.

Jak zbierasz odczyty, np. zbierzesz 8 odczytów, z których każdy ma wartość 0 lub 1, to masz wartość bajta. Podobnie losową wartość bajta możesz uzyskać po 4 odczytach o wartości od 0 do 3. Gdy podczas użytkowania timer wyzwala odczyt i zapamiętanie wartości przeliczonej na liczbę, to ta wartość jest przypadkowa, bo jak szybko jeździsz myszką na tle okna, czy tego panelu, to nie masz kontroli nad tym, na którym akurat pikselu stanie w momencie odczytu, Tak naprawdę jest istotne, czy kursor stanie w rzędzie parzystym, czy nieparzystym, podobnie czy w kolumnie parzystej czy nieparzystej. A jeżeli chcesz generować znaki ze zbioru, których liczba nie jest potęgą dwójki, to np. dla liter alfabetu generujesz wartości 5-bitowe (bo liter jest 26, a więc najbliższa wyższa ilość to 32). Jeżeli wartość wyjdzie z zakresu od 0 do 25 (albo od 1 do 26 lub od 6 do 31, co na jedno wychodzi), to do klucza dopisujesz literę odpowiadającą wartości, a w przeciwnym wypadku ignorujesz wartość, w tym przypadku masz 26/32=81% szans, że dana wartość jest dozwolona. W ogólnym przypadku, prawdopodobieństwo, że wartość będzie dozwolona jest powyżej 50%.

0

jeszcze znalazłem Generator szumu o gaussowskim rozkładzie prawdopodobieństwa, to też by było coś ciekawego jeżeli chodzi o losowość - czyli pomieszać ruch myszki z generatorem szumu i już jest niezły generator. Tylko trzeba pomyśleć co dalej z tym zrobić, bo nie mam sensownego pomysłu.

1

Bzdury, zgodnie z tym artykułem, ręczne generowanie losowości w aplikacji GUI śmierdzi latami dziewięćdziesiątymi. Poprawna odpowiedź jak na rok 2020? Pobieramy bibliotekę libsodium ( https://doc.libsodium.org/ ), i szybko w niej znajdujemy sekcję o generowaniu losowych danych:

https://doc.libsodium.org/generating_random_data

Ręczne odczyty pozycji myszki to szaleństwo

0
enedil napisał(a):

Bzdury...

Co za agresja!

0

Czemu nie użyjesz po prostu openssl? Jak chcesz konkretny kod do generowania randomków to sobie możesz go nawet wyharatać bo libka jest otwarta.

0

Zawsze możesz zainwestować w takie rozwiązanie.

0

@zkubinski: jak analizuję ten wątek, to nie myśl niskopoziomowo, trochę nas wkręciłeś. Od idealnego randoma do przemysłowego generowania pliku licencyjnego wielka droga

generujesz "otwartą" licencję, podpisujesz uznanym gotowym algorytmem, klucz prywatny nie wycieka, uważamy za bezpieczne

0

std::random_device - cppreference.com

std::random_device is a uniformly-distributed integer random number generator that produces non-deterministic random numbers.

std::random_device may be implemented in terms of an implementation-defined pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation. In this case each std::random_device object may generate the same number sequence.''

std::entropy - cppreference.com

double entropy() const noexcept;

(since C++11)

Obtains an estimate of the random number device entropy, which is a floating-point value between 0 and log
2(max()+1) (which is equal to std::numeric_limits<unsigned int>::digits). If the device has n states whose individual probabilities are P
0,...,P
n-1, the device entropy S is defined as

S = -\sum_{i=0}^{n-1}P_i log(P_i)

A deterministic random number generator (e.g. a pseudo-random engine) has entropy zero.

Czyli standard daje nadzieje, że kompilator wspiera liczby losowe, ale nie ma takiej gwarancji.
W praktyce trzeba sprawdzić dokumentację danego kompilatora.

0
AnyKtokolwiek napisał(a):

@zkubinski: jak analizuję ten wątek, to nie myśl niskopoziomowo, trochę nas wkręciłeś. Od idealnego randoma do przemysłowego generowania pliku licencyjnego wielka droga

jak was wkręciłem ? Nie rozumiem ? A po co mi ta losowość ? No kiepski jestem z kryptografii, więc wpadłem na pomysł, że jeżeli uda mi się napisać losowość która z małym prawdopodobieństwem będzie wykazywać powtarzalność (chociaż na chwilę obecną nie wiem jak to sprawdzić) to taki algorytm na moje potrzeby w zupełności wystarczy. Losowość jest mi potrzebna do generowania czegoś w rodzaju sumy kontrolnej aby sprawdzić czy jakiś klucz się nie powtórzył

generujesz "otwartą" licencję, podpisujesz uznanym gotowym algorytmem, klucz prywatny nie wycieka, uważamy za bezpieczne

czyli jak uda mi się napisać taki generatorek, to mam go opublikować jako "otwartą" licencję ?

2

Zobacz jak to robią profesjonaliści:

0

"Najlepszą losowość" zapewniają liczby generowane w oparciu o np mechanikę kwantową, bo można wykorzystać zasadę nieoznaczoności do tego, że nie da się zmierzyć z dowolną dokładnością wartości różnych par cząsteczek, takich jak pozycja, pęd etc. Tutaj jest jeden z pomysłów na tego typu generator: https://www.nist.gov/news-events/news/2018/04/nists-new-quantum-method-generates-really-random-numbers.

1 użytkowników online, w tym zalogowanych: 0, gości: 1