Szyfrowanie z kluczem jednorazowym

Szyfrowanie z kluczem jednorazowym

hejto.pl
Na wstępie powiem, że w tym wpisie używane będą pojęcia, które wyjaśniłem w moich dwóch wcześniejszych wpisach, gdyby coś było niejasne, polecam zajrzeć.
(https://www.hejto.pl/artykul/losowosc-w-informatyce),
(https://www.hejto.pl/artykul/o-utajnianiu-wiadomosci-w-komunikacji-bezposredniej)
Zastanawiałeś się może, co potrzebne jest do stworzenia bezpiecznego szyfru? Rozległa wiedza w dziedzinie matematyki? A może umiejętności programistyczne? Otóż nie, takie umiejętności mogą być przydatne, ale jedyne co naprawdę potrzebujesz to umiejętność dodawania i odejmowania, nie potrzebujesz nawet komputera, ale po kolei.
Czym tak właściwie jest bezpieczny szyfr? Cóż, odpowiedź nasuwa się sama, jest to szyfr, który nie jest możliwy do złamania w rozsądnym czasie. Tu pojawia się problem, każdy jest w stanie stworzyć algorytm, którego nie uda mu się złamać, nie oznacza to jednak, że jest on bezpieczny.
Żeby szyfr uznać za bezpieczny, trzeba udowodnić jego bezpieczeństwo, inaczej mówiąc powiedzieć krok po kroku, niczego nie ukrywając, w jaki sposób działa nasz algorytm, po czym przeprowadzić matematyczny dowód prawdziwości naszych tez. Szyfr powinien opierać się więc na matematycznych problemach, a nie na ukrywaniu metody jego działania.

Szyfrowanie z kluczem jednorazowym

Bez zbędnego przedłużania zacznijmy zabawę.  Przygotujcie kartkę, długopis i generator liczb losowych.
Na początek wybierzemy sposób zapisu wiadomości. W języku polskim występują 32 litery, poza tymi literami często używanymi znakami są spacja, kropka, przecinek i pytajnik. Zapiszmy więc wszystkie znaki w tabeli i ponumerujmy je.

Jak widać, nadaliśmy każdemu znakowi liczbę, teraz musimy jedynie stworzyć klucz, czyli losowy ciąg liczb, który musi mieć długość co najmniej naszej wiadomości. Klucz ten posiadać możesz jedynie ty i odbiorca wiadomości, nikt inny.
Jako że mamy dostępnych 36 znaków, klucz również będzie losowany spośród 36 liczb (od 0 do 35), w jaki sposób wylosujemy te liczby? Cóż, napisałem wcześniej, że nie jest nam potrzebny komputer, także użyjemy kostki do gry. Żeby za pomocą kostki wylosować liczbę z tego przedziału, musimy rzucić nią dwa razy i podstawić wyniki do wzoru:
(pierwszy rzut-1)+((drugi rzut-1)*6)= nasza wylosowana liczba
Przykładowo, jeżeli kostka w pierwszym rzucie pokazała wartość 1, a w drugim rzucie wartość 4 to wylosowaną liczbą będzie 18. (1-1)+((4-1)*6)
Każda wylosowana liczba umożliwi nam zaszyfrowanie jednego znaku, my wylosujemy 5 wartości (musimy rzucić kostką łącznie 10 razy):
Wylosowany klucz w naszym przykładzie wygląda następująco: 0,17,7,22,19. Klucz ten przekazujemy naszemu znajomemu osobiście.
Nadawca wiadomości:
  • Stwórzmy przykładową wiadomość: “hejto”.
  • Zapiszmy wiadomość liczbami oddzielonymi przecinkiem. Litera H ma numer 10 na naszej liście, także będzie miała wartość 10, litera e ma numer 6, także będzie miała wartość 6 itd.

  • Nasza wiadomość na tym etapie wygląda następująco: 10,6,12,25,19.
  • Aby zaszyfrować wiadomość, potrzebujemy klucza, jak pamiętamy naszym tajnym kluczem, są liczby (0,17,7,22,19). Teraz prosta sprawa, sumujemy po kolei liczby z naszej wiadomości z liczbami z klucza (do 10 dodajemy 0, do 6 dodajemy 17, do 12 dodajemy 7 itd.)

  • Otrzymaliśmy wartości 10,23,19,47,38.
  • Teraz na naszych liczbach wykonujemy operacje reszty z dzielenia przez 36. Inaczej mówiąc, jeżeli liczba jest większa lub równa 36 to odejmujemy od niej 36, jeżeli nie to ją przepisujemy (u nas występują dwie liczby większe od 36 (liczba 47 i liczba 38), dlatego od tych liczb odejmiemy 36, a pozostałe liczby przepisujemy bez zmian)

  • Otrzymujemy wartości: 10,23,19,11,2.
  • Zamieńmy liczby na znaki zgodnie z tabelą 10(h),23(s),19(o),11(i), 2(b).
  • Wygenerowaliśmy naszą zaszyfrowaną wiadomość “hsoib”, teraz możemy wysłać ją do naszego odbiorcy np. za pomocą SMS.
  • Niszczymy użytą część klucza.
Odbiorca:
  1. Otrzymuje wiadomość “hsoib”. I zamienia znaki na liczby. 10,23,19,11,2
  2. Bierze wspólnie ustalony klucz (0,17,7,22,19) i odejmuje po kolei wartości ((10-0),(23-17),(19-7)...).
  3. Otrzymuje liczby (10,6,12,-11,-17).
  4. Do wartości, które są ujemne, dodaje liczbę 36, a pozostałe przepisuje bez zmian. (matematycznie: dodaje do liczby 36 i oblicza mod 36)
  5. Otrzymuje: (10,6,12,25,19).
  6. Zamienia liczby na znaki: h(10),e(6),j(12),t(25),o(19).
  7. Niszczy użytą część klucza.
Liczby w kluczu można wygenerować na zapas. Każda liczba wystarczy do zaszyfrowania jednego znaku, więc jeżeli wygenerujemy ich 1000, skopiujemy je i wręczymy kopie znajomemu (najlepiej osobiście), to będziemy mogli w przyszłości wysyłać do 1000 znaków zaszyfrowanej wiadomości, dowolnym kanałem komunikacji np. SMS.
Zastanawiasz się, jak bardzo bezpieczny jest ten algorytm? Cóż, jeżeli poprawnie go zastosujesz to, nie istnieje możliwość odszyfrowania wiadomości (Klucz powinien być: losowy i jednorazowy, po wysłaniu wiadomości ty i odbiorca niszczycie użytą część klucza.). Jak w przypadku każdego szyfru symetrycznego również tutaj istotne jest trzymanie klucza w tajemnicy.
Problem z obliczeniem klucza jest tożsamy z rozwiązaniem równania, a+b=x, znając tylko wartość x. Jedyne co może stwierdzić osoba mająca zaszyfrowaną wiadomość, to liczba znaków w wiadomości. W naszym przykładzie osoba podsłuchująca wiadomość i znająca metodę szyfrowania mogłaby powiedzieć, że zapisaliśmy pięć znaków, nie mogłaby jednak bez klucza stwierdzić jakie to znaki.

Komentarze (2)

zn4

Nie do złamania do momentu, jak okaże się, że algorytm jest losowy tylko z nazwy, w dodatku jednorodny, a user każda wiadomość zaczyna nagłówkiem/przywitaniem

doki16

@zn4 Zgadzam się, dlatego zaproponowałem użycie TRNG (kostki), choć przy odpowiednich algorytmach pseudolosowych i tak możemy się czuć, jak na razie bezpiecznie. 

Zaloguj się aby komentować