Czym właściwie są liczby losowe w kontekście HSM?
Oczywiście bezpieczeństwo kluczy kryptograficznych zależy jeszcze od wielu innych elementów, ale odpowiedź na to pytanie najlepiej zacząć od podstaw generowania kluczy, a liczby losowe to absolutna podstawa. Rządzą nimi prawa matematyki.
Czym właściwie są liczby losowe? Jeżeli pomyślimy o jakiejś liczbie od 1 do 10, żeby zadać komuś zagadkę „Jaka to liczba?” – to czy jej wybór był losowy? A jeśli to będzie liczba w przedziale od 1 do 10 zylionów? Czy ludzki umysł jest w ogóle w stanie wybrać jakąś liczbę losowo i czy jeżeli wybierzemy dwa razy tę samą, bo dajmy na to łatwo nam ją zapamiętać –nasz wybór nie był losowy?
Takie właśnie między innymi pytania mogą przyjść nam głowy, kiedy zaczniemy zagłębiać się w rozważania o losowym generowaniu liczb (i oczywiście o entropii).
Istnieją superkomputery i naprawdę sprytne programy, które losowo wybiorą nam potrzebną liczbę. Są ciągi zerojedynkowe i cyfrowe mechanizmy, o większym lub mniejszym stopniu losowości niż te, które opierają się na zawiłościach i niuansach szumu otoczenia, amplitudach impulsów elektrycznych czy nieuchwytności zachowań właściwych dla mechaniki kwantowej.
Teoria liczb losowych – tworzenie kluczy kryptograficznych
To niektóre ze złożonych teorii i dociekań tworzonych przez matematyków i fizyków, ale chcąc wyłożyć teorię liczb losowych całej reszcie świata, zacznę od najprostszego pytania: czy można wygenerować losową liczbę, ale tak absolutnie losową, że nie będzie jej można odgadnąć? Bo liczba absolutnie losowa jest właśnie tym, czego potrzeba, by stworzyć klucz kryptograficzny, którego nie uda się złamać (co jest najważniejsze, jeśli masz zamiar chronić dane w taki sposób, że nikt, ale to nikt nie będzie mógł się do nich dostać i ani zobaczyć klucza bez płaszczyka kodu.
Jeśli chcesz zapewnić sobie absolutną prywatność i bezpieczeństwo w tworzeniu kluczy kryptograficznych, to jest na to tylko jeden sposób, a sposób ten wymaga początkowego ziarna, które zostanie wybrane losowo. Absolutnie losowo.
Żeby otrzymać prawdziwą liczbę losową, trzeba pójść o wiele dalej niż rzucenie kości, programy komputerowe czy generatory pseudolosowe. Musisz oprzeć się częściowo na najbardziej podstawowych prawach fizyki – i zaraz się przekonasz, że naprawdę nie potrzeba tytułów naukowych, żeby to zrozumieć.
Rzut monetą
Pomyśl o rzucie monetą: orzeł czy reszka. Generalnie uważamy ten wynik za losowy, ale losowość rzutu monetą właściwie zależy od tak zwanego szumu atmosferycznego, który z różnych powodów jest znacznie bardziej efektywny niż algorytmy pseudolosowe stosowane zazwyczaj w oprogramowaniu komputerowym. Osobiście uważam użycie słów „pseudo” i „losowy” w tym samym zdaniu za nieco podejrzane.
Co by się jednak stało, gdyby moneta została rzucona tak, że można byłoby śledzić jej lot w powietrzu albo gdybyśmy znali jej początkową orientację – bylibyśmy w stanie policzyć, ile razy się obróciła, zanim została złapana, a więc dałoby się przewidzieć wynik tego rzutu i prawdopodobnie spowodować, żeby spadła określoną stroną do góry. Nie moglibyśmy więc nazywać tego dłużej zdarzeniem losowym.
Tam, gdzie mamy do czynienia z zagrożeniem fizycznym czy możliwością oszustw finansowych, generatory sprzętowe sprawdzają się znacznie lepiej niż algorytmy.
Rozważmy dwie podstawowe metody generowania liczb losowych
Pierwsza: generowanie liczb losowych (ang. TRNG – True Random Number Generation) opiera się na pomiarach zjawiska fizycznego uważanego za absolutnie losowe. Wszelkie odchylenia w pomiarach muszą być więc uwzględniane, żeby zapewnić całkowitą losowość wyniku. Przykładem mogą tu być pomiary szumu atmosferycznego, szumu otoczenia i innych zjawisk elektrycznych i/lub kwantowych.
Nie istnieje uchwytny wzorzec w generowaniu liczb losowych, dlatego każde z tych zjawisk może nam posłużyć do uzyskania prawdziwie losowego rezultatu. Za każdym razem pomiar przyniesie inny wynik.
Generator liczb losowych opierający się na obliczeniach deterministycznych nie może być nigdy postrzegany jako naprawdę losowy – jeśli wszystkie wartości początkowe (czyli ziarno) są znane, będzie generował wyniki z natury przewidywalne.
W praktyce i w wielu aplikacjach można je uznać za „wystarczająco losowe”. Tak jak czasem wystarczy po postu zamykana szafka na dokumenty, tak czasem ta sama szafka będzie potrzebowała drzwi z patentowym zamkiem, systemu alarmowego, monitoringu wizyjnego i uzbrojonych po zęby ochroniarzy otaczających budynek.
Druga z metod to generowanie liczb pseudolosowych (ang. PRNG – Pseudo-Random Number Generation). Przykładem takiego generatora jest Dual_EC_DRBG (Dual Elliptic Curve Deterministic Random Bit Generator), który opiera się na krzywej eliptycznej.
Wnikliwe badania i analizy dowiodły ponad wszelką wątpliwość, że liczba losowa uzyskiwana tą metodą właściwie nie może być losową, a to dlatego, że krzywizna sama w sobie jest przewidywalna.
A oto jak działa Dual_EC_DRBG: zawiera on listę stałych służących do definiowania krzywej eliptycznej, na której opiera się generator liczb. Stałe te powiązane są z drugim – tajnym zestawem danych, który jest czymś w rodzaju wytrycha. Jeśli zna się te tajne dane, można przewidzieć wynik procesu, który przeprowadza generator, po zgromadzeniu zaledwie 32 bitów … I to by było na tyle, jeśli chodzi o tajność i poufność. Możesz tylko czekać na atak, tylne drzwi są szeroko otwarte.
Bezpieczne klucze kryptograficzne
Jeśli więc twoje klucze kryptograficzne mają być naprawdę bezpieczne, to jedyną opcją jest generator liczb losowych. Musisz mieć pewność, że twoje liczby losowe są naprawdę losowe, inaczej złodzieja danych od twoich informacji będzie dzieliło zaledwie kilka szybkich obliczeń.
Przechowuj więc swoje klucze nie w szafce, a w kasie pancernej i nalegaj na generator liczb losowych. Twój sprzętowy moduł bezpieczeństwa (HSM) jest tak bezpieczny, jak prosta jest kwestia „co jest liczbą losową”. Absolutna pewność jest tym, czego potrzebujemy w pełnym zagrożeń świecie. A to, co ma być wynikiem losowym, musi być wynikiem całkowicie losowym, żeby twoje klucze pozostawały bezpieczne.