Kodowanie (kryptografia)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Kodowanie – w kryptografii jest metodą przeobrażenia jawnej formy wiadomości w formę ukrytą w celu uniemożliwienia dostępu do przekazywanych informacji osobom niepowołanym. Zwykle do tego celu używana jest książka kodowa zawierająca listę powszechnych słów lub wyrażeń wraz z odpowiadającymi im słowami kodowymi. Zakodowaną wiadomość określa się czasami mianem tekstu kodowego, podczas gdy pierwotną wiadomość nazywa się zazwyczaj tekstem jawnym.

Terminem kodowanie określa się często wszelkie formy szyfrowania. Jednak w technicznych zastosowaniach między określeniami kod i szyfr jest istotna różnica – dotyczy ona stopnia zastosowanego przekształcenia tekstu; kody operują na poziomie znaczeń słów i zwrotów, przekształcając te ostatnie w inną ich postać. Szyfrowanie odbywa się na poziomie pojedynczych liter lub ich małych grup, w nowoczesnych szyfrach, nawet na poziomie poszczególnych bitów. O ile kodowanie może przekształcić słowo "zmiana" w "CVGDK" lub "bar", szyfr transformuje je poniżej poziomu semantycznego. Przykładowo, w słowie "atak", "a" może być zmienione na "Q", "t" na "f", drugie "a" na "3" itd. Szyfry w wielu zastosowaniach są wygodniejsze od kodów, ze względu na brak konieczności używania książki kodowej oraz z uwagi na możliwość zautomatyzowania działań za pomocą komputerów.

Długo wierzono, że kody są bezpieczniejsze od szyfrów, jako że (przy założeniu solidnej pracy autora książki kodowej), w przeciwieństwie do tych drugich, w ich użyciu nie było żadnego możliwego do wykrycia wzoru przekształcenia wiadomości (zastosowanego klucza). Jednak z nadejściem automatycznych procesorów, szczególnie elektronicznych komputerów, szyfry zdominowały kryptografię.

Kody jedno- i dwuczęściowe[edytuj | edytuj kod]

Kody są określane za pomocą książek kodowych będących "słownikami" grupującymi kody z odpowiadającymi im fragmentami tekstu jawnego. Pierwotnie kody porządkowano dla wygody projektanta kodu lub kodera zgodnie z uszeregowanym tekstem jawnym; w myśl takiego uporządkowania np. w kodzie numerycznym, w którym to słowom odpowiadają liczby, wyrazom tekstu jawnego zaczynającym się na "a" odpowiadałyby liczby odpowiednio (zgodnie z alfabetycznym ułożeniem wyrazów tekstu jawnego) mniejsze niż słowom z początkową literą "z". W takim systemie ta sama książka mogła być używana do kodowania tekstu jawnego, jak i do dekodowania, czyli procesu odwrotnego.

Takie "jednoczęściowe" kody obarczone jednak były wadą pewnej przewidywalności, która ułatwiała ewentualnym "łamaczom kodów" zauważenie jakichś zależności i co za tym idzie, odczytanie wiadomości lub jej części. W celu utrudnienia życia kryptoanalitykom twórcy kodów zaczęli projektować kody pozbawione wady czytelnych zależności między tekstem jawnym i odpowiadającymi mu fragmentami kodu. W praktyce oznaczało to, że potrzebne były dwie książki kodowe – jedna do zakodowania tekstu jawnego i druga do wyszukiwania kodów w celu zdekodowania tekstu zakodowanego. Pewną analogią są tu dwa słowniki używane podczas nauki języka, np. polsko-angielski i angielsko-polski. Takie "dwuczęściowe" kody wymagały więcej wysiłku podczas pracy z nimi i, w stosunku do "jednoczęściowych", dwa razy tyle trudu przy ich dystrybuowaniu i ich bezpiecznym pozbywaniu się związanym z wymianą, były jednak trudniejsze do złamania.

Kody jednorazowe[edytuj | edytuj kod]

Kod jednorazowy jest ustalonym słowem, wyrażeniem lub symbolem, które jest przewidziane do jednokrotnego użycia w celu przekazania prostej wiadomości – często do wykonania lub przerwania jakiejś akcji albo też do przekazania utajonej informacji o powodzeniu lub nie- jakiegoś planu. Kody jednorazowe są często wymyślane w taki sposób, aby mogły być włączone w sposób niepozorny do niewinnej konwersacji. Utworzone poprawnie, są niemal niemożliwe do wykrycia, chociaż wprawny analityk monitorujący komunikaty kogoś akurat budzącego podejrzenia, może rozpoznać wiadomość typu "Ciocia Berta właśnie zaczęła rodzić", jako tę, która ma prawdziwe złowieszcze znaczenie.

Przykłady kodów jednorazowych:

  • "Jeden, jeśli lądem; dwa, jeżeli morzem" w poemacie Longfellowa, Paul Revere's Ride (Paul Revere galopuje)
  • "Wejdźcie na górę Niitaka" – sygnał dla japońskiej floty przed atakiem na Pearl Harbor[1]
  • Podczas II wojny światowej serwisy zagraniczne brytyjskiej rozgłośni radiowej BBC nadawały "osobiste wiadomości", jako stałą część planu swoich audycji – często wiadomości te były jednorazowymi kodami dla agentów przebywających na terenach wroga.

Czasami tekst wiadomości nie jest wcześniej ustalany, ale jej zwyczajna treść ma dla wtajemniczonego adresata prawdziwe, ukryte znaczenie. Przykładem może być tekst telegramu wysłanego do prezydenta USA, Harry'ego Trumana, podczas jego spotkania ze Stalinem w Poczdamie, informującego amerykańskiego przywódcę o przeprowadzeniu pierwszej udanej próby bomby atomowej.

"Operację przeprowadzono dziś rano. Diagnoza jeszcze niekompletna, ale rezultaty wyglądają na satysfakcjonujące i już przewyższają oczekiwania. Komunikat dla lokalnej prasy konieczny, kiedy zainteresowanie zwiększy się w najwyższym stopniu. Doktor Groves zadowolony. Wraca jutro. Będę nadal informował".

Zobacz też: algorytm szyfrowania typu one-time pad.

Kryptoanaliza a kody[edytuj | edytuj kod]

O ile rozwikłanie monoalfabetycznego szyfru podstawieniowego jest proste, to analogiczne działanie w odniesieniu do prostego nawet kodu sprawia dużo trudności. Odszyfrowanie zakodowanej wiadomości jest podobne w pewnym stopniu do tłumaczenia tekstu napisanego w obcym języku z jednoczesnym budowaniem od podstaw odpowiedniego słownika, tu – "słownika" tekstu jawnego i odpowiadających mu słów (grup słów) kodowych.

Niejakim punktem oparcia w przypadku prostego kodu może być fakt, że niektóre słowa występują w języku powszechniej od innych, jak np. w j. angielskim rodzajniki a czy the. Podobnie, w używanych kiedyś wiadomościach przekazywanych telegraficznie słowem pomocniczym w rozwikłaniu kodu było powszechnie używane – umieszczane na końcu zdania lub akapitu – słowo STOP i odpowiadająca mu zakodowana grupa. Takie i podobne wskazówki pomagały sprecyzować strukturę wiadomości, jeśli nawet nie pod względem znaczeniowym, to ze względu na jej strukturę zdaniową, co było kryptoanalitycznie wielce użyteczne.

Dalszy postęp w rozwiązywaniu zakodowanego tekstu może nastąpić dzięki zebraniu wielu tekstów zakodowanych za pomocą tego samego kodu i użyciu dodatkowych informacji pochodzących z innych źródeł, takich jak:

  • szpiedzy,
  • gazety codzienne,
  • rozmowy na przyjęciach dyplomatycznych,
  • miejsce, z którego przysłano zakodowaną wiadomość,
  • miejsce, gdzie wiadomość została posłana,
  • czas przesłania wiadomości,
  • okoliczności towarzyszące wysłaniu wiadomości (przed i po),
  • zwyczaje ludzi posyłających zakodowaną wiadomość,
  • inne

Przykładowo: szczególna grupa kodu znajdowana niemal wyłącznie w wiadomościach pochodzących z jednej konkretnej armii może oznaczać jej dowódcę. Analogiczna grupa pojawiająca się w komunikatach poprzedzających atak w jakimś określonym miejscu oznaczać może nazwę danej lokalizacji.

Kryptoanalityczne ściągi (ang. a crib – ściąga – w kryptoanalizie oznacza fragment tekstu znanego, lub treści którego można się domyślać, wraz z odpowiadającym mu tekstem zakodowanym) – mogą stanowić bezpośredni "prezent" określeń pewnych grup kodów. Kiedy jakieś grupy kodów są ustalone można z ich pomocą budować stopniowo "masę krytyczną" informacji, ujawniając nowe fragmenty kodu wskutek wykorzystania danego kontekstu i stawiania po drodze różnych hipotez. Kody jednoczęściowe (patrz wyżej) są bardziej podatne na opisane wyżej działania od kodów dwuczęściowych, ponieważ jeśli wiadomo że będąca fragmentem kodu liczba "26839" oznacza słowo "buldożer", to najprawdopodobniej mniejszej liczbie kodowej "17598" odpowiada słowo tekstu otwartego zaczynające się na "a" albo "b". Dotyczy to jednak tylko kodu jednoczęściowego. Można stosować różne podstępy w celu "zasadzenia" ("zasiania") informacji w kodowane wiadomości przeciwnika, np. przez zaatakowanie wroga w ściśle określonym czasie i miejscu i zbadanie wysyłanych po nim zakodowanych wiadomości. Szczególnie użytecznymi wskazówkami są zakodowane błędy; ludzie popełniają błędy, nieraz fatalne. Zasiewanie danych i wykorzystywanie błędów ma miejsce także w pracy łamania szyfrów.

  • Najoczywistszym i, przynajmniej w założeniu, najprostszym sposobem złamania kodu jest zdobycie książki kodowej za pomocą przekupstwa, włamania, zorganizowania napadu – metod nazywanych czasem eufemizmem "praktyczna kryptografia", która jest słabą stroną zarówno kodowania z koniecznością użycia książek kodowych, jak i szyfrowania z jego kluczami. Przy tym, o ile dobry kod może być trudniejszy do złamania od szyfru, to potrzeba napisania, rozpowszechnienia i przechowywania książek kodowych stanowi nie lada kłopot.

Zbudowanie od nowa jakiegoś kodu jest jak skonstruowanie nowego języka i napisanie do niego odpowiedniego słownika; przed erą komputerów było to każdorazowo wielkim wyzwaniem. Jeśli kod jest zagrożony, całą pracę należy wykonać na nowo, co oznacza ogrom pracy tak dla kryptografów, jak dla użytkowników kodu. W praktyce, jeśli kod był w szerokim zastosowaniu, okresowo zmieniano jego zasadniczą część w celu zniechęcenia wrogich kryptoanalityków i dla ograniczenia przydatności skradzionych czy skopiowanych książek kodowych.

Kiedy kod zostaje stworzony, musi nastąpić nieporęczny z punktu widzenia logistycznego proces dystrybucji książek kodowych, który zwiększa szanse zagrożenia nowego kodu. Jest powiedzenie pochodzące od Beniamina Franklina: "Troje ludzi utrzyma tajemnicę, jeśli dwoje z nich nie żyje." i chociaż jest w nim pewna przesada, z pewnością trudno jest utrzymać w tajemnicy sekret znany kilkunastu ludziom. Kody byłyby dość bezpieczne, gdyby były używane w niewielkim kręgu ostrożnych ludzi, ale jeśli cała armia używa tej samej książki kodowej, ochrona tajemnicy jest o wiele trudniejsza.

W przeciwieństwie do kodów bezpieczeństwo szyfrowania generalnie zależy od ochrony kluczy szyfrujących. Mogą one zostać skradzione, ludzie mogą je zdradzić, ale w stosunku do książek kodowych są o wiele prostsze do zmieniania i dystrybuowania.

Superszyfrowanie[edytuj | edytuj kod]

W czasach bliższych dzisiejszym stało się zwyczajem szyfrowanie wiadomości po ich uprzednim zakodowaniu w celu zapewnienia im większego bezpieczeństwa przez wzmożenie stopnia ich kryptoanalitycznej trudności. W przypadku kodów numerycznych zwykle było to realizowane poprzez "dodawanie" do poszczególnych grup cyfr otrzymanego kodu odpowiednio długiej liczby - klucza; przy czym "dodawanie" realizowano cyfra po cyfrze modulo 10.

Przykład: fragment kodu numerycznego – "0102 2791 1234 9642", klucz – "3156" szyfr – "3258 5847 4380 2798". W odróżnieniu od książek kodowych dodawane ciągi liczb mogły być często zmieniane. Słynny japoński kod JN-25 był zaprojektowany według tego wzoru, podobnie jak kilkanaście szyfrów używanych przez Royal Navy po I i podczas II wojny światowej.

Może budzić zdziwienie po co dodatkowe użycie kodu, skoro sam szyfr mógłby zapewnić bezpieczeństwo przekazywanej wiadomości. Poza aspektem bezpieczeństwa dobrze zaprojektowany kod kompresuje wiadomość i dokonuje automatycznej korekcji błędów. W przypadku samego szyfrowania podobny stopień korekcji może być uzyskany tylko przy użyciu komputerów.

Zobacz też[edytuj | edytuj kod]

Przypisy

  1. Scot MacDonald: Evolution of Aircraft Carriers – the Japanese Developments. Naval Historical Center, Washington Navy Yard, DC, 1962.

Bibliografia[edytuj | edytuj kod]

  • Dawid Kahn: Łamacze kodów. Historia kryptologii. Warszawa: WNT, 2004. ISBN 83-204-2746-0..
  • Cliff Pickover: Cryptorunes: Codes and Secret Writing. Pomegranate Communications, 2000. ISBN 978-0-7649-1251-1.