Szyfr Playfair
Autorem tego szyfru był angielski wynalazca Charles Wheatstone, żyjący w XIX wieku. Pierwsze publikacje, które go opisywały, pojawiły się w roku 1854. Jego nazwa bierze się od szkockiego naukowca i parlamentarzysty, Lyon'a Playfair'a, który miał duży udział w jego późniejszym popularyzowaniu.
Zastosowanie
Dzięki wsparciu barona Playfair'a szyfr został zaadoptowany do użytku w brytyjskiej armii i był wykorzystywany podczas drugiej wojny burskiej. Był następnie stosowany przez wszystkie walczące strony podczas obu wojen światowych. Podobnie jak inne szyfry tego okresu, wraz z nadejściem ery komputerów, został wycofany z użycia ze względu na możliwości szybkiego łamania za pomocą ataków siłowych.
Algorytm
Szyfr Playfair jest szyfrem podstawieniowym poligramowym. Oznacza to, że tekst jawny jest dzielony na grupy znaków, a następnie każdej z nich jest przyporządkowywany jeden z wcześniej zdefiniowanych zestawów znaków. W przypadku tego szyfru, algorytm operuje na grupach dwuznakowych.
Przed rozpoczęciem szyfrowania, należy przygotować tabelę na podstawie sekretnego słowa-klucza. Tabela ta ma wymiary 5 na 5 liter i zawiera 25 liter alfabetu łacińskiego (ponieważ ten alfabet liczy 26 liter, to zwykle opuszcza się jeden z rzadkich znaków - x lub q - lub traktuje i oraz j jako jedną literę).
Przy wypełnianiu pól w tabeli, wykorzystuje się sekretne słowo (lub słowa). Najpierw opuszcza się w kluczu wszystkie powtarzające się litery, pomijając kolejne pojawienia się tych samych liter. Potem wpisuje się do tabeli pozostałe litery klucza, w takiej kolejności w jakiej są w nim używane. Strony ustalają wcześniej w jakim porządku wypełniają tabelę (na przykład kolejno wierszami z lewej do prawej, z góry na dół). Pozostałe pozycje w tabeli wypełnia się resztą liter z alfabetu, zwykle w kolejności alfabetycznej.
Przykładowo, używając jako klucza łacińskiej sentencji przypisywanej Wespazjanowi: pecunia non olet, traktując i oraz j wspólnie i wypełniając tabelę wierszami z góry na dół, otrzyma się następującą tabelę:
p | e | c | u | n |
i | a | o | l | t |
b | d | f | g | h |
k | m | r | s | t |
u | w | x | y | z |
Drugim krokiem podczas szyfrowania jest podzielenie tekstu jawnego na części, z których każda zawiera dwie kolejne litery. W razie potrzeby, można dopełnić oryginalny tekst wstawiając na końcu jakąś rzadko używaną literę, na przykład X lub Q.
Algorytm znajduje obie litery z każdej pary w tabeli i wyznacza prostokąt, w którego rogach się one znajdują. Następnie podmienia te dwie litery na dwie litery, wyznaczone przez pozostałe dwa kąty prostokąta. Tak samo postępuje się dla wszystkich par w oryginalnej wiadomości, zastępując je literami otrzymywanymi na podstawie tabeli.
Obie strony muszą wcześniej ustalić w jakiej kolejności będą wpisywać nowe litery (na przykład, jako pierwszą brać literę w rogu prostokąta wyznaczonego przez wiersz, w którym znajduje się pierwszy z kodowanych znaków).
Inaczej wygląda sytuacja, kiedy obie litery w parze do zaszyfrowania znajdują się w jednym wierszu. W takim przypadku, zwykle podmienia się je na dwie litery leżące bezpośrednio po ich prawej stronie (biorąc pierwszą literę w wierszu, jeśli okaże się, że oryginalna litera znajduje się na ostatniej pozycji w tym wierszu).
Podobnie należy się zachować, jeśli obie litery w parze do zaszyfrowania znajdują się w tej samej kolumnie tabeli. Zazwyczaj podmienia się je na dwie litery leżące bezpośrednio pod nimi. Jeśli któraś z tych liter znajduje się na końcu kolumny, to zamienia się ją na literę, która znajduje się na pierwszej pozycji w kolumnie.
Ostatnim przypadkiem, który należy rozważyć, jest sytuacja, w której aktualna para składa się z dwóch takich samych liter. Zwykle dopisuje się przed pierwszą z nich jakiś rzadko stosowany znak, na przykład X lub Q, szyfruje nowo otrzymaną parę i wraca się do kontynuowania całej procedury dla reszty znaków (zaczynając od drugiej z liter oryginalnej pary).
Proces odszyfrowywania wiadomości przebiega w podobny sposób. Odbiorca musi najpierw utworzyć (korzystając ze znanego klucza) taką samą tabelę, jaką dysponował nadawca. Następnie odkodowuje znaki w parach, stosując analogiczne przekształcenia (przesuwając litery w przeciwne strony i odrzucając niepotrzebne litery typu X lub Q).
Siła szyfru Playfair
Ogólna metoda łamania szyfru Playfair polega na analizie częstotliwości występowania podwójnych znaków. Znając takie przybliżone częstotliwości 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.
Z racji swojej prostoty, szyfr ten charakteryzuje się pewnymi cechami, które ułatwiają jego złamanie. Po pierwsze, można zauważyć, że pary liter i odwrotności tych par (czyli połączenia typu AC i CA) dają w wyniku szyfrowania takie same znaki w szyfrogramie. Można to wykorzystać tworząc bazy częstych słów i zwrotów zawierających w sobie takie kombinacje. Ponadto, szyfrogram powstały w wyniku działania szyfru Playfair charakteryzuje się brakiem powtórzonych takich samych liter, znajdujących się koło siebie.
Inną metoda łamania tego szyfru polega na losowym wypełnieniu tabeli i próbowaniu odkodowania wiadomości bazując na niej. Atakujący zmienia następnie tabelę w niewielkim stopniu i znowu odczytuje wiadomość. Postępowanie to należy kontynuować, zapamiętując zmiany w tabeli, które polepszyły jakość przewidywanego tekstu jawnego. Jest to dość łatwa metoda do zastosowania przy użyciu dość prostego algorytmu.
Trzecią, bardzo skuteczną metodą łamania szyfru Playfair jest odgadywanie fragmentów tekstu jawnego, na przykład zwrotu do odbiorcy, daty lub czasu nadania wiadomości. Dysponując szyfrogramem i prawdopodobnymi fragmentami oryginalnego tekstu, bardzo łatwo odtworzyć tablicę używaną do kodowania wiadomości. Metoda ta była często używana w atakach na niemieckie szyfry tego typu w czasie II Wojny Światowej.
Implementacja
Szyfr Playfair jest stosunkowo nieskomplikowany. Po wstępnym przygotowaniu tekstu wejściowego i obu hasła, głównym zadaniem pozostaje odpowiednie manipulowanie numerami kolumn i wierszy w tabeli szyfrującej, dla każdej przetwarzanej pary znaków.
Poniżej przedstawiono funkcję JavaScript, która przeprowadza szyfrowanie wiadomości wejściowej i zwraca utworzony szyfrogram. Słowo kluczowe jest przekazywany do funkcji jako jednowymiarowy ciąg znaków:
var messageOutput = '';
var pos = 0;
while (pos < messageInput.length) {
var m1 = messageInput[pos];
var m2 = '';
if (pos + 1 < messageInput.length) {
if (messageInput[pos + 1] != m1) {
m2 = messageInput[pos + 1];
pos += 2;
} else {
m2 = 'Q' // some dummy letter
pos += 1;
{
} else {
m2 = 'Q' // some dummy letter
pos += 1;
}
var c1 = m1;
var c2 = m2;
var idx1 = keyword.indexOf(m1);
var idx2 = keyword.indexOf(m2);
var row1 = Math.floor(idx1 / 5);
var col1 = idx1 % 5;
var row2 = Math.floor(idx2 / 5);
var col2 = idx2 % 5;
if ((row1 !== row2) && (col1 !== col2)) {
c1 = keyword[(5 * row1) + col2];
c2 = keyword[(5 * row2) + col1];
} else
if ((row1 !== row2) && (col1 === col2)) {
c1 = keyword[(5 * ((5 + row1 + 1) % 5)) + col1];
c2 = keyword[(5 * ((5 + row2 + 1) % 5)) + col1];
} else
if ((row1 === row2) && (col1 !== col2)) {
c1 = keyword[(5 * row1) + ((5 + col1 + 1) % 5)];
c2 = keyword[(5 * row1) + ((5 + col2 + 1) % 5)];
} else {
// error
}
messageOutput = messageOutput.concat(c1);
messageOutput = messageOutput.concat(c2);
}
return messageOutput;
}
Działanie Szyfru Playfair online jest zaprezentowane na stronie Crypto-Online.