Predavanja 9

UVOD U KRIPTOGRAFIJU. ŠIFRIRANJE. CEZAROVA ŠIFRA.

Kriptografija – Uvod – Pojmovi

Kriptografija se bavi šifriranjem podataka kako bi se osigurala privatnost i sigurnost.

Sama riječ kriptografija izvedenica je iz grčkog pridjeva κρυπτός kriptós (što znači tajan, skriven) i glagola γράφω gráfo (što znači pisati) te bi se mogla doslovno prevesti kao tajnopis (Dujella, Maretić, 2007). 

Glavni cilj kriptografije je osigurati sigurnost, privatnost i integritet podataka tijekom prijenosa i pohrane.

To uključuje proces enkripcije (kodiranje) podataka radi zaštite privatnosti i autentičnosti, kao i proces dekripcije (dekodiranje) kodiranih podataka radi ponovnog dobivanja izvorne poruke. 

Načela, koja spadaju među načela informacijske sigurnosti, vrijede i za kriptografiju:

  • Povjerljivost
  • Integritet
  • Ovjera
  • Neporicanje

Kriptografija se koristi u različitim područjima kao što su vojna i sigurnosna komunikacija, financijske transakcije, zaštita osobnih podataka i mnoge druge svrhe. 

Usporedo sa razvojem kriptografije razvila se i znanost kojoj je cilj analizom kriptirane poruke odgonetnuti njen sadržaj. Ta znanost se naziva kriptoanaliza.

Kriptologija, je za razliku grana matematike koja se bavi matematičkim načelima, te matematičkom implementacijom kriptografskih metoda. 

Originalna poruka koju šalje pošiljaoc u daljnjem tekstu će se zvati čisti tekst (plain text) ili original. 

Kodiranje poruke tj. postupak pretvaranja originala (čistog teksta) u nečitljiv (šifrirani) oblik se naziva enkripcija (šifrat). 

Tako enkriptiran tekst ima engleski termin ciphertext, a naziva se kodiranom porukom.

Postupak dekodiranja poruke, tj. vraćanja poruke iz njenog enkriptiranog oblika u originalni (čisti tekst) oblik naziva se dekripcija. 

Današnje metode šifriranja zasnivaju se na uporabi ključa. Ključ je najvažniji dio u pravilnom enkriptiranju i dekriptiranju poruka.

Šifra ili kriptografski algoritam je matematička funkcija koja se koristi za šifriranje i dešifriranje (obično su to dvije funkcije od kojih jedna služi za šifriranje, a druga za dešifriranje).

Osnovni je zadatak kriptografije omogućiti dvjema osobama (pošiljatelju i primatelju) komuniciranje preko nesigurnog komunikacijskog kanala (telefonska linija, računalna mreža, …) na način da treća osoba (protivnik) ne može razumjeti njihove poruke.

Protivnik prisluškujući može doznati sadržaj šifrata, ali ne može odrediti otvoreni tekst.

Primatelj, koji zna ključ kojim je šifrirana poruka, tada može dešifrirati šifrat, tj. odrediti otvoreni tekst

U kriptografskoj literaturi uobičajeno ih je zvati imenima Alice i Bob. Poruka ne bi smjela “doći u ruke” protivnika koji se još naziva Eva ili Oscar. 

Što je kodiranje/dekodiranje?


“Kodiranje” se često brka s enkripcijom kao konceptom. Zapravo, dva se pojma koriste u vrlo različite svrhe. Kodiranje je proces pretvaranja podataka u određeni oblik skupa znakova. Za razliku od algoritama enkripcije, to je algoritam konverzije koji se koristi bez korištenja vrijednosti ključa i bez sigurnosnih problema. Postoji i suprotnost od procesa kodiranja. Na primjer, jedan od najčešće korištenih algoritama kodiranja je algoritam “base64”. “Dekodiranje” je suprotno od algoritama kodiranja. Kodirani podaci postupkom dekodiranja pretvorit će se u prethodne podatke.

TAJNOST I JAVNOST KLJUČA

Podjela na sustave s tajnim i sustave s javnim ključem. 

Kod sustava s tajnim ključem, ključ za dešifriranje se može izračunati poznavanjem ključa za šifriranje i obratno. Ovi su ključevi najčešće identični, pa sigurnost ovih kriptosustava leži u tajnosti ključa.

Kod sustava s javnim ključem, ključ za dešifriranje ne može se izračunati iz ključa za šifriranje. 

Sigurnost leži u tome da bilo koja osoba može šifrirati poruku poznatim ključem, ali samo osoba koja ima odgovarajući ključ za dešifriranje (privatni ili tajni ključ) može dešifrirati tu poruku.

Generatori slučajnih brojeva


U kriptografiji postoje mnogi kriteriji za sigurnost algoritma. Jedan od tih kriterija povezan je sa slučajnošću generiranja ključa. Da bi kripto algoritam bio jak u kriptografiji, važno je da je ključ dovoljno dugačak i slučajan. Pojavile su se mnoge metode generatora slučajnih brojeva kako bi ključ bio slučajan.

Postoje tri vrste generatora slučajnih brojeva:

Generatori pravih slučajnih brojeva (TRNG)
Generatori pseudoslučajnih brojeva (PRNG)
Kriptografski sigurni generatori pseudoslučajnih brojeva (CSPRNG)
True Random Number Generators (TRNG)
Pseudorandom Number Generators (PRNG)
Cryptographically Secure Pseudorandom Number Generators (CSPRNG)

Generatori pravih slučajnih brojeva - je metoda koja generira nasumične brojeve na temelju stvarnih fizičkih operacija. Primjer ove vrste generiranja nasumičnog broja je bacanje novčića ili kocke. Iako je učinkovita metoda u smislu slučajnosti, nije preferirana metoda u smislu primjenjivosti i brzine.

PRIMJER BACANJA NOVČIĆA

https://www.random.org/coins/

Kriptografski sigurni generatori pseudoslučajnih brojeva (CSPRNG) - je nepredvidiva varijanta PRNG-a. Kao u PRNG metodi, nije moguće predvidjeti i izračunati sljedeću vrijednost (0 ili 1 bit) koju treba matematički proizvesti. PRNG metode se često koriste u testiranju softvera, ali CSPRNG je metoda specifična za kriptografiju.

Generiranje nasumičnog broja s $RANDOM

Ova metoda je primjer PRNG-a. Za generiranje slučajnih brojeva s "$RANDOM" na Linuxu, naredba se može primijeniti na sljedeći način:

Naredba: sudo echo $RANDOM


Generiranje nasumičnog broja s /dev/random

Ova metoda je primjer PRNG-a. Naredba "od" i parametri mogu se koristiti za generiranje brojeva s "/dev/random" na Linuxu. Na primjer, max. Generirajmo dvije različite numeričke vrijednosti, duge 2 bajta i 3 bajta:

Naredba: od -An -N2 -i /dev/random


Parametar “-N” omogućuje određivanje duljine.

KRIPTOGRAFIJA POVIJEST

Začetke kriptografije, odnosno šifriranja poruka, moguće je pronaći još kod starih Grka u 5. st. pr. Kr. Spartanci su upotrebljavali Skital, drveni štap ili palicu na koji bi namotali traku od kože ili pergamenta te na njega okomito napisali poruku. 

Kada bi se traka odmotala, poruka na njoj postala bi nečitljiv skup znakova koju bi glasnik mogao predati, a pročitati bi je mogao samo onaj koji je posjedovao Skital jednakog promjera

Supstitucijska šifra kojom se služio Julije Cezar i koja je i danas poznata kao Cezarova šifra (Singh, 2003). Cezar se u komunikaciji sa svojim prijateljima i saveznicima koristio šifrom u kojoj su se slova otvorenog teksta zamjenjivala slovima koja su se nalazila tri mjesta dalje od njih u abecedi (A → D, B → E). 

Na taj bi način zbunio neprijatelja koji bi presreo poruku (Dujella, 2016). On se koristio ključem za šifriranje i dešifriranje koji je iznosio K = 3 (tri mjesta dalje u abecedi), no u supstitucijskoj šifri ključ K može biti bilo koji prirodan broj iz skupa {1, 2, 3, …, 26}, ukoliko se radi o engleskom alfabetu ili, pak, {1, 2, 3, …, 30} ukoliko se radi o hrvatskoj abecedi.

Evo jednostavnog primjera Cezarove šifre u programskom jeziku Python:

def cezarova_sifra(tekst, pomak):
    sifrat = ""
    for znak in tekst:
        if znak.isalpha():
            ascii_vrijednost = ord(znak)
            novi_ascii = ascii_vrijednost + pomak
            if znak.islower():
                if novi_ascii > ord('z'):
                    novi_ascii -= 26
                elif novi_ascii < ord('a'):
                    novi_ascii += 26
            elif znak.isupper():
                if novi_ascii > ord('Z'):
                    novi_ascii -= 26
                elif novi_ascii < ord('A'):
                    novi_ascii += 26
            sifrat += chr(novi_ascii)
        else:
            sifrat += znak
    return sifrat

def main():
    otvoreni_tekst = input("Unesite otvoreni tekst: ")
    pomak = int(input("Unesite pomak za Cezarovu šifru: "))
    sifrat = cezarova_sifra(otvoreni_tekst, pomak)
    print("Šifrat:", sifrat)

    # Objasnjenje zamjene slova
    print("\nPomak:", pomak)
    for znak in otvoreni_tekst:
        if znak.isalpha():
            ascii_staro = ord(znak)
            ascii_novo = ascii_staro + pomak
            if znak.islower():
                if ascii_novo > ord('z'):
                    ascii_novo -= 26
                elif ascii_novo < ord('a'):
                    ascii_novo += 26
            elif znak.isupper():
                if ascii_novo > ord('Z'):
                    ascii_novo -= 26
                elif ascii_novo < ord('A'):
                    ascii_novo += 26
            print(f"Slovo '{znak}' zamijenjeno je slovom '{chr(ascii_novo)}'")
    
if __name__ == "__main__":
    main()

Dakle, kriptosustav sastoji se od kriptografskog algoritma, svih mogućih otvorenih tekstova i šifrata, te prostora ključeva.

CyberChef alat

CyberChef je moćan alat za rad s različitim vrstama enkripcija i kodiranja.

https://gchq.github.io/CyberChef/#recipe=ROT13(true,false,false,3)&input=Y2lwaGVy

Zadatak 1:

Prema supstitucijskoj tabeli ispod, nađite otvoreni tekst kodirane poruke – “ungfrknyleynausk”

Zadatak 2: Caesarova šifra

Cilj: Trebate dešifrirati poruku koja je šifrirana pomoću Caesarove šifre.

  • Šifrirana poruka: “Frph wr Fberfkhb”
  • Pomak: 3
  • Zadatak: Koristiti funkciju “Caesar Cipher” u CyberChef-u za dešifriranje poruke.

Zadatak 3: Binarno kodiranje

Cilj: Pretvoriti običan tekst u binarni kod i obratno.

  • Običan tekst: “Dobro došli na CyberChef”
  • Zadatak: Koristiti funkciju “To Binary” za pretvaranje teksta u binarni oblik, a zatim funkciju “From Binary” za vraćanje originalnog teksta.

Zadatak 4: Base64 enkodiranje i dekodiranje

Cilj: Trebate enkodirati i dekodirati tekst koristeći Base64.

  • Običan tekst: “Tajna poruka”
  • Zadatak: Koristiti funkciju “To Base64” za enkodiranje teksta, a zatim funkciju “From Base64” za dekodiranje i provjeru ispravnosti.