Lekcja 7- szyfrowanie, funkcja skrótu

Lekcja 7- szyfrowanie, funkcja skrótu
Photo by Micah Williams / Unsplash

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:

  1. Szyfrowanie wiadomości do swojego przyjaciela przy użyciu ustalonego klucza.
  2. Wysłanie zaszyfrowanego tekstu.
  3. 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:

  1. Klucz publiczny: Dostępny dla każdego, służy do szyfrowania danej informacji. Nie jest używany w procesie deszyfrowania.
  2. 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")