# data[].attributes.body
Ula Iwańska

# data[].attributes.attachment_link.title
Historia kryptografii 2/8 - Szyfr Cezara

# data[].attributes.body
Ula Iwańska

# data[].attributes.body
Zuzanna Morosko

# data[].attributes.attachment_link.readable_text
Zacznijmy od wyjaśnienia idei szyfru Cezara. Jest to jeden z najprostszych szyfrów przesuwających. Polega ona na przesunięciu każdej litery o pewną stałą wartość zwaną kluczem. Prześledźmy przykład:

Zaszyfrujmy słowo Marcin kluczem o wartości równej -2. A więc każdą literę przesuwamy w lewą stronę o dwie wartości:

Oczywiście szyfrowanie odbywa się w zakresie liter alfabetu łacińskiego. Aby zaszyfrować literę a należy się cofnąć do końca alfabetu i będzie to litera y:

$$... x\ \overbrace{y}^{"a"\ po\ zaszyfrowaniu}\ z\ \overbrace{a}^{\overleftarrow{2}}\ b\ c\ ...$$

Słowo " Marcin" po zaszyfrowaniu wygląda następująco: " Kypagl".

Aby zdeszyfrować dane słowo należy przesunąć każdy znak o $$-\ klucz$$, czyli w tym przypadku o $$-(-2)=2$$.

Szyfr Cezara jest szyfrem symetrycznym, ponieważ do szyfrowania i deszyfrowania wykorzystujemy ten sam klucz, dodatkowo jest to szyfr podstawieniowy (litery nie zmieniają swojego położenia, tylko zostają podmienione na inne).

Przeanalizujemy przypadek szyfrowania dużych liter o kluczu z przedziału $$[-26..26]$$.

Załóżmy, że klucz ma wartość $$- 2$$. Każdą literę musimy przesunąć o $$2$$ w lewo. Dla liter powyżej litery $$B$$ problem jest trywialny. Dla liter $$A$$ i $$B$$ należy odliczyć odpowiednią liczbę znaków począwszy od $$Z$$ w dół.

Natomiast dla klucza równego $$2$$ aby zaszyfrować literę $$Z$$ musimy przejść do początku alfabetu i tu odliczyć dwa znaki.

Rozwiązanie w C++ (dla dużych liter języka łacińskiego):

//algorytm.edu.pl #include<iostream> using namespace std; void szyfruj(int klucz, char tab[]) { int dl = strlen(tab); //określenie ilości znaków wyrazu //sprawdzenie, czy klucz miesci sie w zakresie if(!(klucz >= -26 && klucz <= 26)) return; if(klucz >= 0) for(int i=0;i<dl;i++) if(tab[i] + klucz <= 'Z') tab[i] += klucz; else tab[i] = tab[i] + klucz - 26; else for(int i=0;i<dl;i++) if(tab[i] + klucz >= 'A') tab[i] += klucz; else tab[i] = tab[i] + klucz + 26; } int main() { char tab[1001]; //tablica znaków - max 1000 znaków. int klucz; cout<<"Podaj wyraz składający się z dużych liter: "; cin>>tab; cout<<"Podaj klucz z przedziału [-26..26]: "; cin>>klucz; szyfruj(klucz,tab); //szyfrowanie cout<<"Po zaszyfrowaniu: "<<tab<<endl; szyfruj(-klucz,tab); //deszyfrowanie cout<<"Po rozszyfrowaniu: "<<tab<<endl; return 0; }

Szyfrowanie małych liter

Do poprawnego szyfrowania małych liter należy zmodyfikować funkcję zamieniając znak A na a oraz Z na z:

void szyfruj(int klucz, char tab[]) { int dl = strlen(tab); //określenie ilości znaków wyrazu //sprawdzenie, czy klucz miesci sie w zakresie if(!(klucz >= -26 && klucz <= 26)) return; if(klucz >= 0) for(int i=0;i<dl;i++) if(tab[i] + klucz <= 'z') tab[i] += klucz; else tab[i] = tab[i] + klucz - 26; else for(int i=0;i<dl;i++) if(tab[i] + klucz >= 'a') tab[i] += klucz; else tab[i] = tab[i] + klucz + 26; }

Szyfrowanie uniwersalne

W tym miejscu przedstawię program, który szyfruje całe zdania bez względu na wielkość liter. Dla odmiany rozwiązanie korzysta z klasy string:

//algorytm.edu.pl #include<iostream> #include<string> using namespace std; inline int sprawdz(char znak) { //jesli jest mala litera if(znak >= 'a' && znak <= 'z') return 0; //jesli jest duza litera if(znak >= 'A' && znak <= 'Z') return 1; //inna niż litera return 2; } void szyfruj(int klucz, string &tab) { //sprawdzenie, czy klucz miesci sie w zakresie if(!(klucz >= -26 && klucz <= 26)) return; int pom; char a, z; for(int i = 0; i < tab.size(); i++) { pom = sprawdz(tab[i]); //ustalienie wielkosci litery if(pom < 2) { if(pom == 0) a = 'a', z = 'z'; else a = 'A', z = 'Z'; if(klucz >= 0) if(tab[i] + klucz <= z) tab[i] += klucz; else tab[i] = tab[i] + klucz - 26; else if(tab[i] + klucz >= a) tab[i] += klucz; else tab[i] = tab[i] + klucz + 26; } } } int main() { string tab; int klucz; cout<<"Podaj zdanie do zaszyfrowania: "; getline(cin, tab); cout<<"Podaj klucz z przedziału [-26..26]: "; cin>>klucz; szyfruj(klucz,tab); //szyfrowanie cout<<"Po zaszyfrowaniu: "<<tab<<endl; szyfruj(-klucz,tab); //deszyfrowanie cout<<"Po rozszyfrowaniu: "<<tab<<endl; return 0; }

Alternatywne rozwiązanie (być może bardziej zrozumiałe)

Założenia:

klucz jest znany, na przykład równy 3

szyfrujemy duże litery

Popatrzmy teraz na kilka początkowych i ostatnich znaków w alfabecie:

$$A,\ B,\ C,\ ...,\ W,\ X,\ Y,\ Z$$

Zauważmy, że począwszy od znaku X, gdy przesuniemy tą literę o 3 miejsca to wyskoczymy poza alfabet. W takiej sytuacji możemy rozpatrzeć oddzielnie przypadki dla liter X, Y oraz Z (tak zwane "wyifowanie" przypadków).

Deszyfrowanie opiera się na tej samej idei.

Rozwiązanie alternatywne:

//algorytm.edu.pl #include<iostream> #include<cstring> using namespace std; void szyfruj(char tab[]) { //zakładamy, że klucz ma wartosć 3 int i=0; while(tab[i]) { if(tab[i] == 'X') tab[i] = 'A'; else if(tab[i] == 'Y') tab[i] = 'B'; else if(tab[i] == 'Z') tab[i] = 'C'; else if(tab[i]<'X') tab[i]+=3; ++i; } } void deszyfruj(char tab[]) { //zakładamy, że klucz ma wartosć 3 int i=0; while(tab[i]) { if(tab[i] == 'A') tab[i] = 'X'; else if(tab[i] == 'B') tab[i] = 'Y'; else if(tab[i] == 'C') tab[i] = 'Z'; else if(tab[i] > 'C') tab[i]-=3; ++i; } } int main() { char tab[1001]; //tablica znaków - max 1000 znaków cout<<"Podaj wyraz składający się z dużych liter: "; cin>>tab; szyfruj(tab); //szyfrowanie cout<<"Po zaszyfrowaniu: "<<tab<<endl; deszyfruj(tab); //deszyfrowanie cout<<"Po rozszyfrowaniu: "<<tab<<endl; return 0; }

# data[].attributes.attachment_link.description
Zacznijmy od wyjaśnienia idei szyfru Cezara. Jest to jeden z najprostszych szyfrów przesuwających. Polega ona na przesunięciu każdej litery o pewną stałą wartość zwaną kluczem. Prześledźmy przykład: Zaszyfrujmy słowo Marcin kluczem o wartości równej -2. A więc każdą literę przesuwamy w lewą stronę o dwie wartości: Oczywiście szyfrowanie odbywa się w zakresie liter alfabetu łacińskiego.

# data[].attributes.body
Zuzanna Morosko

# data[].attributes.attachment_link.readable_text
jest jednym z klasycznych algorytmów szyfrujących. Należy on do grupy tzw. polialfabetycznych szyfrów podstawieniowych. Szyfr ten błędnie został przypisany twórcy bardziej skomplikowanego szyfru Blaise'owi de Vigenère.

Szyfr, który obecnie nazywamy szyfrem Vigenère'a po raz pierwszy został opisany przez Giovana Batista Belaso w 1553 w broszurze zatytułowanej La cifra del. Sig. Giovan Batista Belaso.

Działanie szyfru Vigenere'a oparte jest na następującej tablicy:

Jak można zauważyć, każdy z wierszy tablicy odpowiada szyfrowi Cezara, przy czym w pierwszym wierszu przesunięcie wynosi 0, w drugim 1 itd.Aby zaszyfrować pewien tekst, potrzebne jest słowo kluczowe. Słowo kluczowe jest tajne i mówi, z którego wiersza (lub kolumny) należy w danym momencie skorzystać.

Przypuśćmy, że chcemy zaszyfrować prosty tekst, np.:
TO JEST BARDZO TAJNY TEKST

Do tego celu użyjemy znanego tylko nam słowa kluczowego, np. TAJNE Na początku zauważamy, że użyte słowo kluczowe jest zbyt krótkie, by wystarczyło do zaszyfrowania całego tekstu, więc należy użyć jego wielokrotności. Będzie to miało następującą postać:

TA JNET AJNETA JNETA JNETA
TO JEST BARDZO TAJNY TEKST

Następnie wykonujemy szyfrowanie w następujący sposób: litera szyfrogramu odpowiada literze z tabeli znajdującej się na przecięciu wiersza, wyznaczanego przez literę tekstu jawnego i kolumny wyznaczanej przez literę słowa kluczowego, np. po kolei T i T daje M, O i A daje O itd. W efekcie otrzymujemy zaszyfrowany tekst:

MO SRWM BJEHSO CNNGY CROLT Odszyfrowywanie przebiega bardzo podobnie. Bierzemy kolejne litery szyfrogramu oraz odpowiadające im litery słowa kluczowego (podobnie, jak przy szyfrowaniu). Wybieramy kolumnę odpowiadającą literze słowa kluczowego. Następnie w tej kolumnie szukamy litery szyfrogramu. Numer wiersza odpowiadający znalezionej literze jest numerem litery tekstu jawnego. Np. w kolumnie T litera M znajduje się w wierszu T, w kolumnie A litera O znajduje się w wierszu O itd.

Warto zauważyć, że tak naprawdę nie ma znaczenia, czy litera tekstu jawnego będzie wyznaczała wiersz, a słowa kluczowego kolumnę, czy na odwrót, efekt szyfrowania będzie zawsze taki sam.
K2(i) = [26 - K(i)] mod 26
gdzie K(i) - kolejne litery słowa kluczowego, numerowane A=0, B=1 itd., a K2(i) - kolejne litery hasła "odwróconego". 26 oznacza liczbę liter alfabetu łacińskiego.
Istnieje jednakże prostszy, szczególnie dla celów implementacyjnych, sposób deszyfrowania. Wymaga on wykonania prostej operacji "odwrócenia" hasła, jak poniżej:

Następnie należy na szyfrogramie wykonać operację szyfrowania z otrzymanym hasłem. Wynikiem, jak można się przekonać, będzie postać jawna tekstu.
Oryginalny szyfr Vigenère'a

Efektem działania takiego przekształcenia dla hasła "TAJNE" będzie słowo "HARNW".

tekst jawny: TO JEST BARDZO TAJNY TEKST
klucz: NT OJES TBARDZ OTAJN YTEKS

Oryginalny szyfr Vigenère'a używał autoklucza, pierwsza litera klucza była ustalana, a kolejnymi literami były kolejne litery tekstu jawnego.
Odszyfrowanie przebiega w następujący sposób, pierwszą literę szyfrogramu, odszyfrowywujemy ustaloną literą (N), kolejne litery, dopiero co odszyfrowanymi literami:
Niech naszą literą szyfrującą, będzie N

H T → O
X O → J
...

tekst zaszyfrowany: GH XNWL UBRUCN HTJWL RXOCL
klucz: N T O J E S ...
tekst odszyfrowany: T O J E S T ...

szyfrogram: G H X N W L ...

# data[].attributes.attachment_link.title
Szyfr Vigenere'a (opis i działanie) - Szyfrowanieee

# data[].attributes.attachment_link.description
jest jednym z klasycznych algorytmów szyfrujących. Należy on do grupy tzw. polialfabetycznych szyfrów podstawieniowych. Szyfr ten błędnie został przypisany twórcy bardziej skomplikowanego szyfru Blaise'owi de Vigenère. Szyfr, który obecnie nazywamy szyfrem Vigenère'a po raz pierwszy został opisany przez Giovana Batista Belaso w 1553 w broszurze zatytułowanej La cifra del. Sig.

# data[].attributes.body
http://www.crypto-it.net/pl/proste/szyfr-vigenere.html

Na czym polega + zastosowanie + przykładowa tablica

A. Sitarz

# data[].attributes.attachment_link.description
Szyfr Vigenère’a jest jest wieloalfabetowym szyfrem podstawieniowym, wykorzystujacym tablicę tabula recta do szyfrowania i deszyfrowania.

# data[].attributes.body
https://www.math.edu.pl/szyfr-cezara

Wytłumaczenie + opcja szyfrowania/ odszyfrowywania

A. Sitarz

# data[].attributes.attachment_link.description
Jeden z najstarszych sposobów szyfrowania pochodzi od Juliusza Cezara, który szyfrował swoją korespondencję z Cyceronem. Sposób ten polegał na tym, że zamiast każdej litery pisał literę występującą w alfabecie trzy miejsca dalej. Tak więc, jeśli użyjemy dzisiejszego alfabetu łacińskiego abcdefghijklmnopqrstuvwxyz to zamiast c będziemy pisać f, zamiast g piszemy j, zamiast y piszemy b.