Lekcja 7- szyfrowanie, funkcja skrótu
Szyfrowanie:
"Szyfrowanie danych to proces, który obejmuje pobranie określonej informacji i przekształcenie jej w niezrozumiały fragment tego samego tekstu.
Szyfrowanie symetryczne:
W tym rodzaju szyfrowania stosuje się jedynie jeden klucz do zarówno zaszyfrowania, jak i odszyfrowania informacji. Dzięki temu prostemu procesowi implementacji, korzystając z jednego klucza, przykład może być następujący:
- Szyfrowanie wiadomości do swojego przyjaciela przy użyciu ustalonego klucza.
- Wysłanie zaszyfrowanego tekstu.
- Przyjaciel używa tego samego klucza do odszyfrowania otrzymanej wiadomości.
W przypadku szyfrowania symetrycznego używamy jednego klucza zarówno do zaszyfrowania, jak i odszyfrowania wiadomości. Klucz ten jest wspólnym “sekretem”, który jest udostępniany przez osoby korzystające z tego rodzaju szyfrowania.
Zaletą tego podejścia jest znacznie wyższa wydajność i niskie zużycie zasobów. Jednak ma ono także wady, takie jak konieczność udostępniania klucza wielu osobom, co nie zawsze gwarantuje dobre zastosowanie klucza.
Szyfrowanie symetryczne jest powszechnie używane i stanowi istotny element współczesnego cyberbezpieczeństwa. Poniżej znajdują się przykłady aplikacji i narzędzi, w których jest wykorzystywane:
- Popularne aplikacje do przesyłania wiadomości, takie jak WhatsApp czy Telegram, używają szyfrowania symetrycznego do zapewnienia poufności wysyłanych wiadomości. Wiadomości są widoczne i czytelne tylko dla zamierzonych odbiorców.
- Oprogramowanie do szyfrowania, jak na przykład VeraCrypt, jest przeznaczone do zabezpieczania plików, chroniąc poufne dane przechowywane na urządzeniach. Zapewnia bezpieczeństwo nawet w przypadku utraty klucza lub kradzieży urządzenia.
Szyfrowanie asymetryczne:
To trochę bardziej złożone niż szyfrowanie symetryczne. Dlaczego? Ponieważ do jego zastosowania potrzebujemy dwóch kluczy – jednego do zaszyfrowania informacji, a drugiego do jej odszyfrowania. W tym przypadku żaden z kluczy nie pełni obu funkcji.
Szyfrowanie asymetryczne to nowszy i zdecydowanie bezpieczniejszy sposób szyfrowania poufnych informacji. W tym przypadku używamy dwóch kluczy:
- Klucz publiczny: Dostępny dla każdego, służy do szyfrowania danej informacji. Nie jest używany w procesie deszyfrowania.
- Klucz prywatny: Odpowiada za odszyfrowanie danych informacji. Jest tylko w posiadaniu osoby, której zadaniem jest odszyfrowywanie informacji.
Dzięki wykorzystaniu dwóch par kluczy, ten rodzaj szyfrowania znajduje zastosowanie w wielu branżach i technologiach, które priorytetowo traktują zabezpieczanie przekazywanych informacji. Ta metoda jest szeroko stosowana do ochrony danych o szczególnym znaczeniu i zapewniania bezpiecznej komunikacji. Praktyczne zastosowania szyfrowania asymetrycznego obejmują:
- Komunikacja e-mail (PGP, S/MIME): Oba protokoły korzystają z kluczy prywatnych i publicznych do szyfrowania treści przekazywanych e-maili, co gwarantuje poufność i utrzymanie integralności wiadomości.
- Podpisy cyfrowe: Wykorzystują one model szyfrowania asymetrycznego, potwierdzając tym samym tożsamość osoby podpisującej i chroniąc przed ewentualnym sfałszowaniem dokumentu.
- Protokoły SSL/TLS: Stosowane na przykład w bankowości internetowej, zapewniają bezpieczeństwo transmisji danych pomiędzy przeglądarką użytkownika a stroną internetową." [1]
Funkcja skrótu (hash):
Funkcja skrótu przekształca wiadomość o dowolnej długości na wiadomość o określonej długości. Wynik takiej funkcji nazywany jest skrótem (ang. hash).
Własności funkcji skrótu:
- odporność na odtwarzanie przeciwobrazów (jednokierunkowość) – oznacza to, że odzyskanie oryginalnej wiadomości na podstawie znajomości jej skrótu jest zadaniem trudnym obliczeniowo, przeciwobrazem w tej sytuacji nazywamy wiadomość, dla której został obliczony skrót.
Obecnie najczęściej wykorzystywaną funkcją skrótu jest SHA-2 (Secure Hash Algorithm 2). Zastąpił on poprzedni algorytm (SHA-1), dla którego znaleziono liczne skuteczne ataki podważające jego bezkolizyjność. [2]
Program z szyfrowaniem (szyfr Cezara):
ZNAKI = [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"Ą",
"ą",
"Ć",
"ć",
"Ę",
"ę",
"Ł",
"ł",
"Ń",
"ń",
"Ó",
"ó",
"Ś",
"ś",
"Ź",
"ź",
"Ż",
"ż",
" ",
".",
"?",
"!",
]
tekst_do_zaszyfrowania = input("Wprowadź tekst do zaszyfrowania: ")
klucz = int(input("Wprowadź długość klucza (liczba całkowita): "))
zaszyfrowany_tekst = ""
for litera in tekst_do_zaszyfrowania:
obecny_index = ZNAKI.index(litera)
docelowy_index = (obecny_index + klucz) % len(ZNAKI)
zaszyfrowany_tekst += ZNAKI[docelowy_index]
print(f"Tekst po zaszyfrowaniu to: {zaszyfrowany_tekst}")
modulo (%) pomaga nam w kodzie powyżej zawinąć listę znaków do szyfru na początek: ((indeks obecnego znaku + klucz przyjęty do szyfrowania)/ilość znaków) —> reszta z dzielenia to indeks nowego znaku (znaku po zaszyfrowaniu)
Program książka telefoniczna (jeszcze do ulepszenia):
# Przyjmijmy prosty schemat wpisu do ksiazki:
# klucz to ciąg znaków imienia (string)
# - jak ktoś wpisze imie i nazwisko też będzie ok ,
# wartością będzie lista z nr. tel (string) i opisem (string)
ksiazka_tele = {"Jan": ["783267543", "ktostam"], "Ola": ["798432122", "ktostam2"], "Kasia": ["798888322", "ktostam3"]} #zeby bylo na czym pracowac
# ksiazka_tele = {}
while True:
# Zapytanie o wybranie operacji
operacja = input(
"Wybierz operację do wykonania:\n\
1 - dopisanie pozycji do książki\n\
2 - aktualizacja pozycji książki\n\
3 - usunięcie pozycji książki\n\
4 - wydruk imion z książki\n\
5 - wydruk całej książki telefonicznej\n\
6 - koniec programu\nPodaj kod operacji = "
)
if not operacja:
break
# Wykonanie wybranej operacji
if operacja == "1":
print("Wybrano 1")
nowa_pozycja_nazwa = input("Wprowadź imię/nazwisko lub nick: ")
nowa_pozycja_telefon = input("Wprowadz nr telefonu: ")
nowa_pozycja_opis = input("Wprowadź opis: ")
ksiazka_tele[nowa_pozycja_nazwa] = [nowa_pozycja_telefon, nowa_pozycja_opis]
print(f"Dodano nową pozycję: {nowa_pozycja_nazwa} - {ksiazka_tele[nowa_pozycja_nazwa]}.")
elif operacja == "2":
print("Wybrano 2")
nowa_pozycja_nazwa = input("Wprowadź imię/nazwisko lub nick: ")
if nowa_pozycja_nazwa in ksiazka_tele.keys():
while True:
print("Ta nazwa znajduje się już w książce. Wprowadź inną.")
break
elif nowa_pozycja_nazwa not in ksiazka_tele.keys():
nowa_pozycja_telefon = input("Wprowadz nr telefonu: ")
nowa_pozycja_opis = input("Wprowadź opis: ")
ksiazka_tele[nowa_pozycja_nazwa] = [nowa_pozycja_telefon, nowa_pozycja_opis]
print(f"Dodano nową pozycję: {nowa_pozycja_nazwa} - {ksiazka_tele[nowa_pozycja_nazwa]}")
elif operacja == "3":
print("Wybrano 3")
usun_pozycje = ksiazka_tele.pop(input("Podaj nazwę do usunięcia: "))
print(f"Usunięto pozycję oraz {usun_pozycje} przypisane dla tej nazwy.")
elif operacja == "4":
print("Wybrano 4")
print(f"Oto wszystkie kontakty z książki: {ksiazka_tele.keys()}")
elif operacja == "5":
print("Wybrano 5")
print(f"Oto Twoja książka telefoniczna: {ksiazka_tele.items()}")
elif operacja == "6":
break
else:
print("\nPodano błędny kod operacji")
# Koniec programu
print("\nKoniec programu")