Szyfr Nihilist

Po raz pierwszy użyty w latach osiemdziesiątych XIX wieku w Rosji w organizacjach Nihilistów.

Zastosowanie

Nazwa szyfru pochodzi od ruchu Nihilistów, którzy występowali przeciwko caratowi w Rosji i posuwali się do organizowania ataków na carskich urzędników. W 1881 roku przeprowadzili udany zamach, który zakończył się śmiercią cara Aleksandra II.

Oryginalny algorytm nie był bardzo silny, ale z biegiem czasu powstawały jego nowe odmiany zapewniające lepsze bezpieczeństwo. Szyfrem wywodzącym się z tej rodziny jest szyfr VIC.

Algorytm

Algorytm szyfru Nihilist wykorzystuje w swoim działaniu macierz, nazywaną kwadratem Polybius'a (ang. Polybius square). Macierz ta ma wymiary 5x5 i jest wypełniona wszystkimi literami alfabetu łacińskiego (ponieważ alfabet łaciński ma 26 liter, to zwykle litery i oraz j traktowane były jako jeden znak).

Kolejność liter w macierzy zależy od sekretnego słowa kluczowego, które jest współdzielone pomiędzy komunikującymi się stronami. W celu ustalenia kolejności liter, należy pominąć w słowie kluczowym powtarzające się litery, a następnie wpisać pozostałe litery do tablicy. Zwykle litery wpisuje się wierszami od góry do dołu, od lewej strony do prawej, ale strony mogą umówić się wcześniej na stosowanie innej konwencji. Resztę pól w macierzy wypełnia się pozostałymi literami z alfabetu, które nie znalazły się w słowie kluczowym. Zwykle litery wpisuje się do tablicy w kolejności alfabetycznej.

Zarówno wiersze jak i kolumny tablicy są numerowane cyframi od 1 do 5.

Przykładowo, jeśli jako słowa kluczowego użyto by pełnego imienia cara zabitego przez Nihilistów: Aleksandr II Nikolaevich (a dokładniej jego angielskiej transkrypcji), tablica będzie miała postać:

  1 2 3 4 5
1 a l e k s
2 n d r i o
3 v c h b f
4 g m p q t
5 u w x y z

Każdą literę sekretnego klucza oraz każdą literę wiadomości zamienia się na dwucyfrową liczbę wskazaną przez numer wiersza i numer kolumny. Należy rozróżnić słowo kluczowe używane do utworzenia tablicy i słowa sekretnego klucza, używanego do szyfrowania komunikacji. Zwykle są one różne i muszą być współdzielone pomiędzy komunikującymi się stronami.

Szyfrowanie polega na dodawaniu kolejnych liczb utworzonych z liter tekstu jawnego i sekretnego klucza. Wyniki mogą być liczbami dwucyfrowymi lub trzycyfrowymi. Szyfrogram może mieć formę ciągu takich liczb lub być dodatkowo zamieniony na litery, przy użyciu odwrotnej transformacji.

Przykładowo, kolejne kroki podczas szyfrowania zdania Acta est fabula za pomocą sekretnego słowa Vivere i z wykorzystaniem powyższej tabeli Polybius'a są przedstawione poniżej.
Tekst jawny i sekretny klucz szyfrujący należy zapisać w wierszach, jeden pod drugim:

actaestfabula
v i v e r e v i v e r e v

Po zamianie liter na liczby wiersze mają postać:

11 32 45 11 13 15 45 35 11 34 51 12 11
31 24 31 13 23 13 31 24 31 13 23 13 31

Szfrogram powstaje przez dodanie kolejno liczb tekstu jawnego i klucza:

42 56 76 24 36 28 76 59 42 47 74 25 52

Odbiorca, znając liczby sekretnego klucza, odejmuje je od liczb szyfrogramu, otrzymuje liczby tekstu jawnego, które następnie zmienia na litery korzystając z takiej samej tabeli, jakiej używał nadawca.

Siła szyfru Nihilist

Szyfr Nihilist jest w swoim działaniu podobny do szyfru Vigenère'a. Do jego analizy i łamania można więc stosować analogiczne metody. Analizując częstotliwości znaków w szyfrogramie, należy brać pod uwagę kolejne dwucyfrowe liczby.

Podczas szyfrowania za pomocą algorytmu Nihilist stosuje się zwykłe dodawanie (bez operacji modulo), dlatego w szyfrogramie mogą występować liczby trzycyfrowe. Dzieje się tak, kiedy odpowiadające im litery z tekstu jawnego i sekretnego klucza znajdują się w ostatnim (piątym) wierszu w tabeli (czyli obie sumowane liczby mają wartość większą niż 50). Cecha ta znacznie ułatwia kryptoanalizę szyfrogramu.

Łamanie szyfru Nihilist

Pierwszym krokiem łamania szyfru jest wyznaczenie długości sekretnego klucza. Można tego dokonać sprawdzając potencjalne długości klucza dla prawdopodobnych wartości (przykładowo od 4 do 15 znaków). Dla każdego z tych numerów, należy zapisać szyfrogram, załamując linie po ilości znaków równej temu numerowi. Otrzymuje się w ten sposób tablice, o ilości kolumn równej aktualnie analizowanej długości sekretnego klucza.

Następnie, dla każdej z otrzymanych w ten sposób tabel, należy sprawdzić znaki w poszczególnych kolumnach. We wszystkich kolumnach wszystkie liczby powinny mieć cyfry dziesiątek i cyfry jedności nie różniące się od siebie o więcej niż 5. Dzieje się tak, ponieważ w każdej kolumnie wszystkie znaki zostały zakodowane przy użyciu tej samej litery sekretnego klucza, czyli do każdej liczby tekstu jawnego z tej kolumny dodano taką samą liczbę odpowiadającą literze w kluczu. Wartość tej liczby klucza nie ma więc wpływu na różnice pomiędzy wartościami liczb zakodowanych za jej pomocą.

Dodając dowolne liczby z kwadratu Polybius'a do jednej konkretnej liczby również znajdującej się w kwadracie Polybius'a, zawsze otrzymuje się wyłącznie liczby, których cyfry dziesiątek i cyfry jedności nie różnią się od siebie o więcej niż 5 (czyli różnica pomiędzy największą i najmniejszą cyfrą dziesiątek w kolumnie nie może być większa niż 5, podobnie wygląda sprawa z cyframi jedności). W dalszych poszukiwaniach należy brać pod uwagę tylko te macierze (czyli tylko te potencjalne długości klucza), które spełniają powyższy warunek.

Drugim krokiem jest określenie możliwych liczb klucza, które mogłyby być użyte do szyfrowania. Dla każdej kolumny należy znaleźć wszystkie dopuszczalne liczby, które odejmowane po kolei od każdej liczby szyfrogramu w kolumnie, w wyniku dadzą liczbę o wartości pomiędzy 11 a 55 (włącznie). Każda inna ewentualna liczba klucza, która nie spełnia tego warunku powinna być odrzucona. W praktyce można w ten sposób wyeliminować bardzo wiele potencjalnych liczb klucza.

Dalsza kryptoanaliza szyfrogramu może polegać na podmienianiu liczb na litery metodą prób i błędów w poszukiwaniu rozwiązań ujawniających fragmenty tekstu jawnego. Dla każdej takiej próby można wygenerować wszystkie możliwe klucze szyfrujące i odejmować je od szyfrogramu otrzymując potencjalne znaki tekstu jawnego.