Szyfr Dwukwadratowy (Podwójny Playfair)

Szyfr dwukwadratowy jest odmianą szyfru Playfair, która zapewnia nieco lepsze zabezpieczenie chronionych wiadomości.

Zastosowanie

Szyfr dwukwadratowy był stosowany przez polityków i wojskowych wielu krajów przez kilkaset lat, aż do II Wojny Światowej. Obecnie jest uważany za łatwy do złamania, przy użyciu stosunkowo nieskomplikowanych i szybkich ataków siłowych.

Algorytm

Szyfr dwukwadratowy jest szyfrem podstawieniowym poligramowym. Oznacza to, że otrzymany tekst jawny wiadomości jest dzielony na grupy znaków, a następnie każdej z tych grup jest przyporządkowywana jedna z innych, wcześniej zdefiniowanych grup znaków. Szyfr dwukwadratowy operuje na grupach dwuliterowych.

Przed rozpoczęciem szyfrowania, należy przygotować dwie tabele na podstawie dwóch sekretnych słów (lub dłuższych fraz) pełniących rolę sekretnych kluczy. Obie tabele mają wymiary 5 na 5 liter i zawierają 25 liter alfabetu łacińskiego. Z racji tego, że alfabet łaciński ma 26 liter, zwykle pomija się jeden rzadki znak (x lub q), ewentualnie traktuje się i oraz j jako jedną literę.

Do wypełniania pól w tabelach, wykorzystuje się wspomniane wyżej sekretne słowa (słowa kluczowe, nazywane również kluczami). W obu kluczach pomija się wszystkie powtarzające się litery (opuszczając wszystkie ponowne pojawienia się tych samych liter). Następnie wykorzystuje się pozostałe litery kluczy do wypełnienia tabel - do pierwszej tabeli wpisuje się litery pierwszego klucza, a do drugiej tabeli litery z drugiego klucza. Obie strony muszą ustalić wcześniej w jakiej kolejności wypełniają tabele literami (na przykład, kolejno wierszami od lewej do prawej, z góry na dół). Pozostałe pozycje w tabelach wypełnia się pozostałymi literami alfabetu, zwykle w kolejności alfabetycznej.

Przykładowo, używając jako sekretnych kluczy imion obojga rodziców rzymskiego cesarza Wespazjana: Titus Flavius SabinusVespasia Polla, traktując litery i oraz j wspólnie i wypełniając tabele wierszami z góry na dół, otrzyma się następujące dwie następujące tabele:

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

Tabele powinny być zapisane jedna obok drugiej lub jedna pod drugą, tak aby linie wierszy (lub odpowiednio linie kolumn) zostały zachowane.

Drugim etapem szyfrowania jest podzielenie tekstu jawnego na pary, z których każda zawiera dwie kolejne litery. W razie potrzeby, należy dopełnić oryginalny tekst wstawiając na końcu jakąś rzadko używaną literę, na przykład X lub Q.

Aby zaszyfrować każdą parę liter, trzeba znaleźć pierwszą literę z każdej pary w pierwszej tabeli, a drugą literę w drugiej tabeli. Następnie należy wyznaczyć prostokąt (rozciągający się na dwie tabele), w którego dwóch rogach znajdują się znalezione litery. Następnie trzeba podmienić dwie znalezione litery na dwie litery, wyznaczone przez dwa pozostałe kąty prostokąta. W ten sam sposób należy postępować ze wszystkimi parami liter w oryginalnej wiadomości, zastępując je literami otrzymywanymi na podstawie obu tabel szyfrujących.

Przykładowo, szyfrując parę AS za pomocą powyższych tabel, otrzyma się parę IL lub LI.

Obie strony powinny wcześniej ustalić, w jakiej kolejności będą dopisywać nowe litery do tworzonego szyfrogramu. Na przykład, pierwszą literę można brać z pierwszej (lewej) tabeli, a drugą literę pary z drugiej (prawej) tabeli.

Jeśli obie litery w parze do zaszyfrowania znajdują się w tym samym wierszu (lub w zależności od ułożenia tabel - w tej samej kolumnie), to nowa para dopisana do szyfrogramu powinna być taka sama jak oryginalne litery tekstu jawnego. Słabością szyfru dwukwadratowego jest to, że sytuacja taka zdarza się dla mniej więcej 20% możliwych par.

Proces odczytania szyfrogramu przebiega w podobny sposób. Odbiorca musi najpierw utworzyć (korzystając ze znanych sobie sekretnych kluczy) takie same dwie tabele, jakich używał nadawca wiadomości. Następnie powinien odkodować litery w kolejnych parach, stosując przekształcenia analogiczne do tych opisanych powyżej.

Siła szyfru dwukwadratowego

Największą słabością szyfru dwukwadratowego jest częste powtarzanie się w szyfrogramie fragmentów tekstu jawnego. Bazując na tym oraz na dwóch sposobach atakowania szyfrów podstawieniowych - analizie częstotliwości występowania podwójnych znaków oraz odgadywaniu fragmentów tekstu jawnego - atakujący jest w stanie stopniowo odsłaniać coraz większe fragmenty oryginalnej wiadomości.

Analiza częstotliwości występowania podwójnych znaków w szyfrogramie polega na wyszukiwaniu częstych powtórzeń tych samych par liter. Znając przybliżone częstotliwości występowania dwuznaków dla języka, w którym zapisano przekazywaną wiadomość, można próbować dopasowywać częste powtórzenia w szyfrogramie do częstych par liter w danym języku. Należy mieć na uwadze, że dzięki zastosowaniu dwóch kluczy, jest to zadanie trudniejsze niż w przypadku zwykłego szyfru Playfair.

Odgadywanie fragmentów tekstu jawnego polega na zgadywaniu miejsc w szyfrogramie, które odpowiadają popularnym zwrotom, których można spodziewać się w łamanych wiadomościach, na przykład powitaniu drugiej osoby albo daty lub czasu nadania wiadomości. Dysponując szyfrogramem i prawdopodobnymi fragmentami oryginalnego tekstu, można odtworzyć tablice używane do kodowania wiadomości. Metoda ta była często używana w atakach na niemieckie szyfry tego typu w czasie Drugiej Wojny Światowej.

Implementacja

Szyfr Dwukwadratowy można zaimplementować stosunkowo prosto. Po wstępnym przygotowaniu tekstu wejściowego i obu haseł, głównym wyzwaniem pozostaje odpowiednie operowanie numerami kolumn i wierszy tabel szyfrujących, dla każdego przetwarzanego znaki.

Poniżej przedstawiono funkcję JavaScript, która przeprowadza szyfrowanie wiadomości wejściowej i zwraca utworzony szyfrogram. Oba słowa kluczowe są przekazywane do funkcji jako jednowymiarowe ciągi znaków:

function encrypt(messageInput, keyword) {
  var messageOutput = '';

  var pos = 0;
  while (pos < messageInput.length) {
    var m1 = messageInput[pos];
    var m2 = '';

    if (pos + 1 < messageInput.length) {
        m2 = messageInput[pos + 1];
        pos += 2;
    } else {
      m2 = 'Q' // some dummy letter
      pos += 1;
    }

    var c1 = m1;
    var c2 = m2;

    var idx1 = keyword[0].indexOf(m1);
    var idx2 = keyword[1].indexOf(m2);

    if (Math.floor(idx1 / 5) !== Math.floor(idx2 / 5)) {
      c1 = keyword[0][(5 * Math.floor(idx2 / 5)) + idx1 % 5];
      c2 = keyword[1][(5 * Math.floor(idx1 / 5)) + idx2 % 5];
    }

    messageOutput = messageOutput.concat(c1);
    messageOutput = messageOutput.concat(c2);
  }

  return messageOutput;
}

Działanie Szyfru Dwukwadratowego online jest zaprezentowane na stronie Crypto-Online.