Python_Notatki Z7
Kwestionariusz:


Podsumowanie poprzednich zajęć:

Szyfrowanie:

To jest proces odwracalny.
Nie można zostawiać tylnej furtki, bo to niszczy całe bezpieczeństwo
Funkcja skrótu:

To jest proces nieodwracalny!!!!
Te same dane zazwyczaj zwracają ten sam hash. Jesteśmy w stanie stwierdzić czy hash powstał na podstawie konkretnych danych wejściowych.
W bazach danych nie przechowują hasła, tylko hash'e do tych haseł
Sprawdzenie, czy dane nie zostały przez kogoś zmodyfikowane...

checksum....

Jeśli wykonamy określony hash sha256 to dostaniemy taki wynik, jeżeli wynik jest inny, to inny hash dostajemy
Strona - certyfikat teles

Czy dane są godne zaufania - pomaga Hash
Także używane w słownikach do szybkiego znalezienia danych — hashowanie kluczy

Szyfrowanie:

Są różne algo szyfrujące....
Klucze symetryczne, asymetryczne

1 klucz do zaszyfrowania i do odczytania info

Słaby punkt tego to sam klucz symetryczny (powiedzmy hasło). Jak wysłać, przekazać taki klucz by go nie przechwycili.

Do szyfrowania klucz publiczny, ale do odszyfrowania — prywatny klucz



Łączenie się z serwerem — szyfrowanie asymetryczne. ssh protokół

Zazwyczaj korzystamy z gotowych algo/protokołów szyfrujących

smart things - internet of things - szyfrowanie symetryczne, bo szybkie
Użyć szyfrowanie asymetryczne do przekazania klucza symetrycznego. I wtedy można bezpiecznie potem korzystać z symetrycznego klucza



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",
"Ą",
"ą",
"Ć",
"ć",
"Ę",
"ę",
"Ł",
"ł",
"Ń",
"ń",
"Ó",
"ó",
"Ś",
"ś",
"Ź",
"ź",
"Ż",
"ż",
" ",
".",
"?",
"!",
]
# powyższa lista znaków ułatwi stworzenie kodu odpowiedzialnego za szyfrowanie
# żeby przy bardzo dużym kluczu , lub przy zamianie znaku z końca listy nie wyjść za nią
# można skorzystać z operatora modulo (to ten od reszty z dzielenia)
# wg. schematu (indeksznaku + klucz) % len(ZNAKI)
# indeksznaku = ZNAKI.index("!")
# print(f"Indeks znaku to: {indeksznaku}")
# klucz = 3
# nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
# print(f"Po przesunieciu o {klucz} uzyskamy {nowy_indeks}")
# jeśli nie chcemy skorzystać z naszej własnej tablicy znaków,
# to można to też zrobic korzystajac z tablicy znaków Unicode.
# Przydadzą się wtedy funkcje:
# ord - zwraca nr unicode znaku
# chr - zwraca znak po podaniu nr unicode
wiadomosc_uzytkownika = input("Wprowadź zdanie: ")
klucz = int(input("Wprowadź klucz: "))
wiadomosc_zaszyfrowana = ""
for litera in wiadomosc_uzytkownika:
indeks_znaku = ZNAKI.index(litera)
nowy_indeks = (indeks_znaku + klucz) % len(ZNAKI)
wiadomosc_zaszyfrowana = wiadomosc_zaszyfrowana + ZNAKI[nowy_indeks]
print(f"Tekst zaszyfrowany to: {wiadomosc_zaszyfrowana}")
Kolejność króków:
1. Tworzę listę znaków (jest już zrobiona)
2. Tworzę zmienną do której będzie przypisane to co wprowadzi osoba korzystająca z aplikacji. Tworzę też pozostałe potrzebne zmienne - klucz (ponownie input) i zmienną dla zaszyfrowanego tekstu.
3. Przemieszczam się po każdym znaku z wpisanego tekstu (pętla for)
4. Dla każdego znaku sprawdzam jego indeks
5. Do indeksu dodaję wartość klucza
6. Na podstawie tego nowego indeksu wyciągam nową literę z listy znaków. Aby "wrócić na początek" listy w przypadku wyjścia poza nią korzystam ze wzoru z modulo (ten wzór służy do znalezienia indeksu)
7. Dodaję nową literę do zaszyfrowanego tekstu
8. Poza pętlą wyświetlam zaszyfrowany tekst.


Kiedy zrobisz własną listę znaków, to szyfr cezara robi się bezpieczniejszy.
Nie jest to algo szyfrujący o wysokim stopniu ochrony

użycie nieskończonej pętli While True:
Problem ze słownikiem jest taki, że nie może być 2 takich samych imion
Skończyć książkę w domu.
from os import system, name
# 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ędą dane kontaktowe (string)
ksiazka_tele = {"Imię":"nr. tel."}
while True:
lista_imion = list(ksiazka_tele.keys())
# Zapytanie o wybranie operacji
operacja = input("""
Wybierz operację do wykonania:
1 - dopisanie pozycji do książki
2 - aktualizacja pozycji książki
3 - usunięcie pozycji książki
4 - wydruk imion z książki
5 - wydruk całej książki kontaktowej
6 - koniec programu
Podaj kod operacji = """
)
if not operacja:
print("Wpisz prawidłową operację.")
# Wykonanie wybranej operacji
if operacja == "1":
print("Wybrano 1")
nowe_imie = input("Wpisz imie/nazwe dla nowego wpisu: ")
kontakt = input("wpisz dane kontaktowe: ")
ksiazka_tele[nowe_imie] = kontakt
elif operacja == "2":
print("Wybrano 2")
# lista_imion = list(ksiazka_tele.keys())
# print(f"Oto lista imion w książce: {lista_imion}")
imie_edytowane = input("Wpisz imię osoby, dane której chcesz zmienić: ")
if lista_imion.count(imie_edytowane) > 0:
ksiazka_tele[imie_edytowane] = input("Nowe dane kontaktowe: ")
else:
print("Nie ma takiego kontaktu")
elif operacja == "3":
print("Wybrano 3")
# lista_imion = list(ksiazka_tele.keys())
# print(f"Oto lista imion w książce: {lista_imion}")
imie_usuwane = input("Wpisz imię osoby, dane której chcesz usunąć: ")
if lista_imion.count(imie_usuwane) > 0:
ksiazka_tele.pop(imie_usuwane)
else:
print("Nie znaleziono takiego kontaktu do usunięcia.")
elif operacja == "4":
print("Wybrano 4")
# lista_imion = list(ksiazka_tele.keys())
# print(f"Oto lista imion w książce: {lista_imion}")
licznik_temp = 1
for element in lista_imion:
print(f"{licznik_temp}. {element}")
licznik_temp += 1
elif operacja == "5":
print(ksiazka_tele)
print("Wybrano 5")
ksiazka_lista = ksiazka_tele.items()
for klucz, znaczenie in ksiazka_lista:
print("Następny kontakt:")
print(klucz)
print(znaczenie)
print("*************")
elif operacja == "6":
break
else:
print("\nPodano błędny kod operacji")
# Koniec programu
print("\nKoniec programu")