Szyfr Cezara

Transkrypt

Szyfr Cezara
ALGORYTMY I
STRUKTURY DANYCH
Paulina Wojtalewicz
i
Aleksandra Milczarek
TEMATY, KTÓRYMI SIĘ ZAJMIEMY, TO :
Wyszukiwanie palindromów
 Szyfr Cezara
 Szyfry przestawieniowe
 Dodawanie dużych liczb
 Mnożenie dużych liczb,

Ciekawi?- (założymy się, że tak), wszystkie te
tematy przybliżymy Wam za chwilę
Wyszukiwanie
palindromów
WYSZUKIWANIE PALINDROMÓW
Problem
W łańcuchu s znaleźć wszystkie palindromy o długości większej od 1.
Przez palindrom (ang. palindrome) rozumiemy łańcuch znakowy s, który czyta się tak
samo w obu kierunkach.
Przykład:
ABBCBBA – jest palindromem
ABBCABA – nie jest palindromem
Palindromy pojawiają się w genetyce (łańcuchy DNA, RNA), w tekstach, muzyce,
matematyce, geometrii, fizyce itd. Stąd duże zainteresowanie informatyków w
efektywnych algorytmach ich znajdowania. W badaniach genetycznych często
szuka się tzw. przybliżonych palindromów (ang. aproximate palindromes), tzn.
palindromów, w których do k-znaków może być błędnych, czyli nie pasujących
do dokładnego palindromu (ang. exact palindrome). Takie palindromy występują
w łańcuchach DNA, w których wystąpiły różnego rodzaju błędy genetyczne.
Problemem palindromów przybliżonych nie zajmujemy się w tym opracowaniu.
WYSZUKIWANIE PALINDROMÓW
Wprowadźmy symbol sR, który oznacza łańcuch znakowy
o odwróconej kolejności znaków w stosunku do
łańcucha s.
Przykład:
s = ABCD
sR = DCBA
Łańcuch s jest palindromem, jeśli da się rozłożyć na dwa
podłańcuchy w i wR wg poniższego schematu:
s = wwR – palindrom parzysty (ang. even palindrome),
lub
s = wXwR – palindrom nieparzysty (ang. odd
palindrome), gdzie X jest dowolnym symbolem alfabetu.
WYSZUKIWANIE PALIDROMÓW
Rozwiązanie nr 1
Pierwszy algorytm wyszukiwania palindromów jest
algorytmem naiwnym. Rozkłada on dany łańcuch
znakowy s na wszystkie możliwe podłańcuchy p o
długości nie mniejszej niż 2 znaki i sprawdza następnie,
czy dadzą się przedstawić w postaci wwR lub wXwR.
Sprawdzenie polega na porównywaniu znaków od
początku i od końca podłańcucha. W tym celu
wykorzystuje się dwa indeksy. Jeden z nich ustawia się
na pierwszym znaku podłańcucha p, a drugi na
ostatnim. Następnie porównujemy wskazywane przez te
indeksy znaki podłańcucha p. Jeśli znaki są różne, to
podłańcuch p nie jest palindromem. Jeśli porównywane
znaki są równe, to indeksy przesuwamy – lewy w prawo,
a prawy w lewo. Jeśli indeksy się miną, to zachodzi
jedna z dwóch równości:
WYSZUKIWANIE PALIDROMÓW
p = wwR, lub p = wXwR
W takim przypadku p jest palindromem. Wyszukanie
wszystkich palindromów zawartych w
łańcuchu s proponowaną metodą posiada
sześcienną klasę złożoności obliczeniowej O(n3),
gdzie n jest długością łańcucha s.
WYSZUKIWANIE PALIDROMÓW
Algorytm naiwny wyszukiwania palindromów
Wejście:
s – łańcuch tekstowy.Wyjście:
Wszystkie palindromy zawarte w łańcuchu s.
Elementy pomocnicze:
i,j – indeksy znaków w łańcuchu s, i,j € N
Nn –długość łańcucha s, n € N
NiP –prawy indeks, iP € N
NiL –lewy indeks, iL € N
WYSZUKIWANIE PALINDROMÓW
Lista kroków
Szyfr Cezara
SZYFR CEZARA
Problem
Opracować algorytm szyfrujący i deszyfrujący dla szyfru Cezara
Szyfrowanie tekstów (ang. text encryption) ma na celu ukrycie ważnych
informacji przed dostępem do nich osób niepowołanych. Historia kodów
szyfrujących sięga czasów starożytnych. Już tysiące lat temu egipscy
kapłani stosowali specjalny system hieroglifów do szyfrowania różnych
tajnych wiadomości. Szyfr Cezara (ang. Ceasar's Code lub Ceasar's
Cipher) jest bardzo prostym szyfrem podstawieniowym (ang.
substitution cipher). Szyfry podstawieniowe polegają na zastępowaniu
znaków tekstu jawnego (ang. plaintext) innymi znakami przez co
zawarta w tekście informacja staje się nieczytelna dla osób
niewtajemniczonych. Współcześnie szyfrowanie stanowi jedną z
najważniejszych dziedzin informatyki – to dzięki niej stał się możliwy
handel w Internecie, funkcjonują banki ze zdalnym dostępem do kont,
powstał podpis elektroniczny oraz bezpieczne łącza transmisji danych.
Przykładów zastosowania jest bez liku i dokładne omówienie tej
dziedziny wiedzy leży daleko poza możliwościami tego artykułu.
SZYFR CEZARA
Szyfr Cezara został nazwany na cześć rzymskiego
imperatora Juliusza Cezara, który stosował ten
sposób szyfrowania do przekazywania informacji o
znaczeniu wojskowym. Szyfr polega na
zastępowaniu liter alfabetu A...Z literami leżącymi o
trzy pozycje dalej w alfabecie:
Ostatnie trzy znaki X, Y i Z nie posiadają następników
w alfabecie przesuniętych o trzy pozycje. Dlatego
umawiamy się, iż alfabet "zawija się" i za literką Z
następuje znów litera A. Teraz bez problemu
znajdziemy następniki X → A, Y → B i Z → C.
SZYFR CEZARA
Przykład:
Zaszyfrować zdanie: NIEPRZYJACIEL JEST BARDZO
BLISKO.
Poszczególne literki tekstu jawnego zastępujemy literkami
szyfru Cezara zgodnie z powyższą tabelką kodu. Spacje
oraz inne znaki nie będące literami pozostawiamy bez
zmian:
NIEPRZYJACIEL JEST BARDZO BLISKO
QLHSUCBMDFLHO MHVW EDUGCR EOLVNR
Deszyfrowanie tekstu zaszyfrowanego kodem Cezara
polega na wykonywaniu operacji odwrotnych. Każdą
literę kodu zamieniamy na literę leżącą o trzy pozycje
wcześniej w alfabecie.
SZYFR CEZARA
Podobnie jak poprzednio trzy pierwsze znaki szyfru Cezara nie
posiadają bezpośrednich odpowiedników liter leżących o trzy
pozycje wcześniej, ponieważ alfabet rozpoczyna się dopiera
od pozycji literki D. Rozwiązaniem jest ponowne "zawinięcie"
alfabetu tak, aby przed literą A znalazły się trzy ostatnie literki
X, Y i Z.
Do wyznaczania kodu literek przy szyfrowaniu i deszyfrowaniu
posłużymy się operacjami modulo. Operacja modulo jest
resztą z dzielenia danej liczby przez moduł. Wynik jest
zawsze mniejszy od modułu. U nas moduł będzie równy 26,
ponieważ tyle mamy liter alfabetu.
Jeśli c jest kodem ASCII dużej litery alfabetu (rozważamy tylko
teksty zbudowane z dużych liter), to szyfrowanie kodem
Cezara polega na wykonaniu następującej operacji
arytmetycznej:
c = 65 + (c - 62) mod 26
Deszyfrowanie polega na zamianie kodu wg wzoru:
c = 65 + (c - 42) mod 26
SZYFR CEZARA
Algorytm szyfrowania tekstu kodem Cezara
Wejście
Łańcuch tekstowy sWyjście:
Łańcuch tekstowy s zaszyfrowany kodem Cezara
Elementy pomocnicze:
i – indeks, i €N
kod(x) –zwraca kod litery x
znak(x) –zamienia kod x na odpowiadający mu znak
ASCII

SZYFR CEZARA
Lista kroków
Szyfry
przestawieniowe
SZYFRY PRZESTAWIENIOWE
Problem
Opracować algorytm szyfrujący i deszyfrujący za
pomocą szyfru przestawieniowego
Szyfr przestawieniowy (ang. transposition
cifer) polega na zamianie położenia znaków
tworzących tekst, przez co wiadomość staje się
nieczytelna dla niewtajemniczonego odbiorcy. W
zaszyfrowanym tekście znajdują się wszystkie
znaki tekstu jawnego. Zaczniemy od najprostszych
szyfrów przestawieniowych.
SZYFRY PRZESTAWIENIOWE
Przestawianie dwóch sąsiednich liter
W tym rodzaju szyfru tekst dzielimy na pary znaków.
Następnie w każdej parze zamieniamy ze sobą
litery,
Przykład:
SZYFRY PRZESTAWIENIOWE
Tekst da się podzielić na pary, jeśli zawiera parzystą
liczbę znaków. W przeciwnym razie ostatnia para
jest niepełna. W takiej niepełnej parze liter
oczywiście nie zamieniamy miejscami. Zwróć
uwagę, iż ten szyfr jest symetryczny. Jeśli poddamy
szyfrowaniu tekst poprzednio zaszyfrowany, to
otrzymamy z powrotem tekst jawny.
SZYFRY PRZESTAWIENIOWE
Algorytm szyfrowania przestawieniowego ze
zamianą liter w parach
Wejście
Łańcuch tekstowy s, który zawiera tekst poddawany
szyfrowaniu lub deszyfrowaniu
Wyjście:
Zaszyfrowany łańcuch s
Elementy pomocnicze:
i – indeks, i € N
SZYFRY PRZESTAWIONE
Lista kroków:
Dodawanie dużych
liczb
DODAWANIE DUŻYCH LICZB
Problem
Dodać do siebie dwie dowolnie duże, dodatnie liczby
całkowite, przedstawione w postaci łańcucha cyfr.
Problem rozwiążemy w sposób szkolny (profesjonalne
algorytmy wymagają innego podejścia). Dodawane
liczby musimy wyrównać do ostatnich cyfr:
21638626396236623668969866232198
95832808595775579737342988203408934789797363
DODAWANIE DUŻYCH LICZB
Dodawanie rozpoczniemy od ostatnich cyfr
łańcuchów. Stosujemy przy tym poznane w szkole
podstawowej zasady dodawania dwóch liczb.
Dodajemy ostatnie cyfry. W łańcuchu wynikowym
umieszczamy ostatnią cyfrę wyniku. Natomiast
pierwsza cyfra wyniku staje się przeniesieniem do
następnej pozycji:
DODAWANIE DUŻYCH LICZB
W następnym kroku dodajemy do siebie dwie kolejne
cyfry oraz przeniesienie. Do łańcucha wynikowego
wpisujemy na przedostatniej pozycji ostatnią cyfrę
wyniku, a pierwsza cyfra wyniku staje się
przeniesieniem na dalszą pozycję.
DODAWANIE DUŻYCH LICZB
Jeśli w jednym z łańcuchów
skończą się zbyt wcześnie cyfry,
to przyjmujemy, że posiada on
resztę
cyfr
równych
0.
Sprowadza się to wtedy do
dodawania
przeniesień
do
pozostałych
cyfr
drugiego
łańcucha. Gdy wszystkie cyfry
zostaną
przetworzone,
a
przeniesienie
ma
wartość
większą od 0, to umieszczamy je
na
początku
łańcucha
wynikowego jako pierwszą cyfrę
wyniku.
Przy dodawaniu cyfr musimy
pamiętać,
że
są
one
przechowywane w łańcuchach w
postaci kodów ASCII:
Dlatego w celu otrzymania wartości cyfry
należy od jej kodu odjąć 48, a przy
otrzymywaniu kodu znaku z wartości
cyfry należy do niej dodać 48
DODAWANIE DUŻYCH LICZB
DODAWANIE DUŻYCH LICZB
Mnożenie dużych
liczb
MNOŻENIE DUŻYCH LICZB
Problem 1
Pomnożyć dowolnie dużą nieujemną liczbę całkowitą
przez nieujemną liczbę całkowitą względnie małą, np.
32 bitową.
Naszym zadaniem jest znalezienie iloczynu:
W=a*b
gdzie: a – liczba duża, b – liczba mała
Liczba mała b rozkłada się na sumę potęg liczby 2
mnożonych przez kolejne bity bi liczby b:
MNOŻENIE DUŻYCH LICZB
MNOŻENIE DUŻYCH LICZB
W powyższym wzorze bi to i-ty bit mniejszej liczby. Natomiast kolejne
iloczyny 2ia bardzo łatwo oblicza się dynamicznie za pomocą
dodawania, ponieważ, co łatwo zauważyć, każdy kolejny iloczyn jest
dwa razy większy od poprzedniego.:
Iloczyny dodajemy do wyniku W, jeśli odpowiedni bit bi jest równy 1. W
całym tym postępowaniu wykonywane są tylko dodawania dużych
liczb. Bity z liczby b możemy łatwo wydzielać za pomocą operacji
koniunkcji i przesuwów
MNOŻENIE DUŻYCH LICZB
MNOŻENIE DUŻYCH LICZB
Dziękujemy za uwagę


Podobne dokumenty