- trandom.py – wieloźródłowy generator liczb losowych
- Do czego służy trandom?
- Jak to działa – mechanizm wewnętrzny
- Wymagania
- Windows (bez zewnętrznych zależności)
- Linux / macOS
- Instalacja i uruchomienie
- Opcje wiersza poleceń – szczegółowy opis
- Tryby generowania (wyłączne, domyślnie: –int)
- Opcje wyjścia
- Opcje źródeł entropii
- Opcje informacyjne
- Przykłady użycia
- 1. Generowanie pojedynczej liczby losowej (domyślne)
- 2. Generowanie zestawu liczb do Lotto (6 z 49)
- 3. Generowanie 5 losowych liczb zmiennoprzecinkowych
- 4. Generowanie 32 losowych bajtów (256 bitów) jako hex
- 5. Zbieranie entropii myszy przez 10 sekund, potem losowa liczba
- 6. Zbieranie entropii klawiatury, potem 64 bajty
- 7. Połączenie entropii klawiatury + czujników
- 8. Losowy wybór z listy argumentów
- 9. Tasowanie elementów
- 10. Tasowanie linii ze stdin
- 11. Podgląd hex 256 losowych bajtów
- 12. Zapis wyniku do pliku
- 13. Generowanie 1000 liczb z paskiem postępu
- 14. Sondowanie dostępnych źródeł entropii
- Porównanie z wbudowanymi modułami Pythona
- Zatrzymywanie programu
- Podsumowanie
trandom.py – wieloźródłowy generator liczb losowych
trandom.py to generator liczb losowych (True Random Number Generator) napisany w Pythonie, który czerpie entropię z wielu źródeł sprzętowych i systemowych. W przeciwieństwie do generatorów pseudolosowych (Mersenne Twister, LCG) nie opiera się na deterministycznym algorytmie, lecz na fizycznym szumie pochodzącym z drżenia zegara CPU, fluktuacji czasów dostępu do dysku, wyścigów wątków, adresów alokacji pamięci, timingu sieciowego oraz systemowego CSPRNG. Opcjonalnie można dodać entropię z ruchów myszy, naciśnięć klawiszy i czujników sprzętowych (temperatura CPU, wentylatory, napięcia, bateria).
Program zbiera wszystkie źródła entropii, miesza je przez SHA3-512, a następnie SHA-256, dając na wyjściu równomiernie rozłożone dane losowe.
GitHub: github.com/IgorBrzezek/trandom
Do czego służy trandom?
Generator trandom znajduje zastosowanie wszędzie tam, gdzie potrzebna jest wysoka jakość losowości:
- Losowania LOTTO i innych gier liczbowych – generowanie zestawów liczb w zadanych zakresach (np. 1-49 dla Lotto, 1-80 dla Keno).
- Testy i symulacje – potrzeba nieprzewidywalnych danych wejściowych.
- Kryptografia – generowanie kluczy, nonce, wektorów inicjalizacyjnych.
- Edukacja i demonstracja – pokazanie, jak działa sprzętowe zbieranie entropii.
- Bezpieczne tasowanie – tasowanie list, zestawów pytań, talii kart.
- Generowanie haseł i tokenów – losowe ciągi bajtów.
Jak to działa – mechanizm wewnętrzny
trandom.py implementuje klasę TrueRandom, która na każde żądanie gather() próbkuje 7 zawsze aktywnych źródeł entropii:
- System CSPRNG –
os.urandom()pobiera dane z kryptograficznie bezpiecznej puli systemu operacyjnego, która gromadzi entropię z przerwań sprzętowych, ruchów myszy, timingu klawiatury i innych zdarzeń systemowych. - CPU Jitter – mierzy różnice czasu wykonania instrukcji z dokładnością nanosekund. Niewielkie obliczenia (
[i**2 for i in range(30)]) wykonywane są w pętli, a różnice czasowe wynikające ze stanu potoku CPU, chybienia cache i zarządzania energią stanowią entropię. - Disk Timing – odczytuje fragment pliku skryptu z precyzyjnym pomiarem czasu. Fluktuacje latencji odczytu wywołane buforowaniem dyskowym, stanem kontrolera i opóźnieniami mechanicznymi (lub wear-leveling w SSD) dostarczają entropii.
- Adresy pamięci – alokuje 200 obiektów Pythona w szybkiej sekwencji i zapisuje ich adresy (
id()). Różnice w zachowaniu alokatora sterty i ASLR produkują entropię. - Planiści wątków – uruchamia 4 wątki dokonujące pomiarów czasu ze wspólnym akumulatorem. Niedeterministyczne przeplatanie wątków przez system operacyjny wprowadza entropię z wyścigu (race condition).
- Network Timing – wysyła pojedynczy pakiet UDP na 8.8.8.8:53 i mierzy czas. Nawet jeśli wysyłka się nie powiedzie, sam czas wywołania systemowego ma jitter.
- Liczniki wydajności – zbiera 50 odczytów licznika wysokiej rozdzielczości (
time.perf_counter_ns()). Wariacje na poziomie kwantowym pomiędzy kolejnymi odczytami są przechwytywane.
Opcjonalnie, po dodaniu odpowiednich flag, zbierane są dodatkowe źródła:
- Ruchy myszy (
--mouse) – odpytywanie pozycji kursora co 10 ms z rejestracją delta (dx, dy) i znacznikiem czasowym. - Naciśnięcia klawiszy (
--keyboard) – odpytywanie klawiatury co 10 ms z zapisem kodu klawisza i timestampem. Wyłączne względem--mouse. - Czujniki sprzętowe (
--sensors) – odczyt temperatury CPU, prędkości wentylatorów, napięć i stanu baterii przez bibliotekę psutil lub wmic (Windows).
Wszystkie zebrane dane są konkatenowane, haszowane przez SHA3-512 (64 bajty), a następnie przez SHA-256 (32 bajty). Taka kaskada haszująca zapewnia, że każdy pojedynczy bit entropii z dowolnego źródła wpływa na każdy bit wyjścia.
Wymagania
Windows (bez zewnętrznych zależności)
Wszystkie funkcje, za wyjątkiem czujników sprzętowych, działają bez instalowania dodatkowych pakietów. Śledzenie myszy wykorzystuje Win32 API przez ctypes (wbudowane). Śledzenie klawiatury korzysta z msvcrt (wbudowane).
Linux / macOS
- Entropia myszy (
--mouse) wymaga:pip install pynput - Entropia klawiatury (
--keyboard) używaselectna stdin (wbudowane, bez dodatkowych zależności). - Entropia czujników (
--sensors) wymaga:pip install psutil
Instalacja i uruchomienie
Program to pojedynczy plik – nie wymaga instalacji. Wystarczy pobrać i uruchomić:
python trandom.py [opcje]
Opcjonalne pakiety:
pip install psutil
pip install pynput
Opcje wiersza poleceń – szczegółowy opis
Tryby generowania (wyłączne, domyślnie: –int)
| Opcja | Opis |
|---|---|
--int |
Generuje losową liczbę całkowitą (domyślny tryb). |
--float |
Generuje losową liczbę zmiennoprzecinkową w zakresie [0.0, 1.0). |
--bytes N |
Generuje N losowych bajtów, wyświetla jako hex. |
--hex [N] |
Wyświetla N losowych bajtów w formacie hexdump (domyślnie 256). Pokazuje offset, bajty hex i reprezentację ASCII. |
--choice A B ... |
Losowo wybiera jeden element z podanych argumentów. |
--shuffle |
Czyta linie ze stdin (lub argumentów), tasuje i wypisuje. |
Opcje wyjścia
| Opcja | Opis | Domyślnie |
|---|---|---|
-n N |
Liczba wartości do wygenerowania | 1 |
--min N |
Minimalna wartość dla --int |
0 |
--max N |
Maksymalna wartość dla --int |
2^32-1 |
-o FILE |
Zapis wyjścia do pliku zamiast stdout | – |
Opcje źródeł entropii
| Opcja | Opis |
|---|---|
--mouse |
Zbiera entropię z ruchów myszy. |
--keyboard |
Zbiera entropię z naciskanych klawiszy. Wyłączne z --mouse. |
--sensors |
Zbiera entropię z czujników sprzętowych (CPU, wentylatory, napięcia). |
--duration SEC |
Opcjonalny limit czasu dla zbierania myszy/klawiatury. |
--samples N |
Docelowa liczba próbek myszy/klawiatury (domyślnie 250). |
Opcje informacyjne
| Opcja | Opis |
|---|---|
--list-sources, --probe |
Wykrywa i pokazuje wszystkie dostępne źródła entropii, a następnie kończy działanie. |
-v, --verbose |
Wyświetla szczegółowe informacje o postępie zbierania i generowania. |
--pb, --progressbar |
Pokazuje live pasek postępu podczas generowania wartości. |
Przykłady użycia
1. Generowanie pojedynczej liczby losowej (domyślne)
2. Generowanie zestawu liczb do Lotto (6 z 49)
python trandom.py --int --min 1 --max 49 -n 6
3. Generowanie 5 losowych liczb zmiennoprzecinkowych
python trandom.py --float -n 3
4. Generowanie 32 losowych bajtów (256 bitów) jako hex
5. Zbieranie entropii myszy przez 10 sekund, potem losowa liczba
python trandom.py --mouse --int --duration 10
6. Zbieranie entropii klawiatury, potem 64 bajty
python trandom.py --keyboard --bytes 64
7. Połączenie entropii klawiatury + czujników
python trandom.py --keyboard --sensors --bytes 64 -v
8. Losowy wybór z listy argumentów
python trandom.py --choice apple banana cherry date
9. Tasowanie elementów
python trandom.py --shuffle jeden dwa trzy cztery pięć
10. Tasowanie linii ze stdin
echo -e "alfa\nbeta\ngamma" | python trandom.py --shuffle
11. Podgląd hex 256 losowych bajtów
12. Zapis wyniku do pliku
python trandom.py --bytes 32 -o losowe.hex
13. Generowanie 1000 liczb z paskiem postępu
python trandom.py --int --min 1 --max 49 -n 1000 --pb
14. Sondowanie dostępnych źródeł entropii
python trandom.py --list-sources
python trandom.py --probe
Porównanie z wbudowanymi modułami Pythona
| Moduł | Typ | Źródło entropii | Zastosowanie |
|---|---|---|---|
random |
PRNG | Mersenne Twister (deterministyczny) | Symulacje, gry, testy |
secrets |
CSPRNG | os.urandom() |
Tokeny bezpieczeństwa, hasła |
os.urandom |
CSPRNG | Pula entropii jądra | Kryptografia |
| trandom.py | TRNG | 7+ źródeł fizycznych mieszanych przez SHA3-512+SHA256 | Demonstracja, edukacja, multi-entropia |
Ważne: Do większości rzeczywistych zastosowań kryptograficznych wystarcza os.urandom() i moduł secrets. To narzędzie jest przeznaczone głównie do celów demonstracyjnych, edukacyjnych i eksperymentalnych, gdzie pożądane jest łączenie wielu niezależnych źródeł entropii.
Zatrzymywanie programu
Program działa w pętli aż do zakończenia zadania. W przypadku zbierania entropii myszy lub klawiatury bez limitu czasu, można go przerwać, naciskając Ctrl+C.
Podsumowanie
trandom.py to eleganckie narzędzie dla każdego, kto potrzebuje wysokiej jakości liczb losowych lub chce zrozumieć, jak działa zbieranie entropii ze źródeł fizycznych. Dzięki 7 zawsze aktywnym źródłom entropii i opcjonalnym rozszerzeniom (mysz, klawiatura, czujniki) program dostarcza dane losowe o bardzo dobrej jakości. Wbudowany tryb --probe pozwala sprawdzić, jakie źródła entropii są dostępne na danej platformie, a elastyczne opcje generowania (liczby całkowite, zmiennoprzecinkowe, bajty, hex, wybór, tasowanie) czynią go uniwersalnym narzędziem.
Szczególnie przydatny jest w kontekście losowań liczb – wystarczy podać zakres i ilość, aby otrzymać gotowy zestaw do gry. Można go użyć np. do wygenerowania 6 liczb z zakresu 1-49 (Lotto), 5 z 50 (EuroJackpot) czy dowolnego innego wariantu.
Źródła: github.com/IgorBrzezek/trandom
