Skip to main content Link Search Menu Expand Document (external link)

Digitalni Potpisi i Certifikati

Ova skripta je dodatak na kolegiju te obrađuje osnove digitalnih potpisa i certifikata. U njoj ćete se upoznati s konceptom digitalnih potpisa kao mehanizma za provjeru integriteta i autentičnosti podataka, te s načinima njihove implementacije korištenjem asimetrične kriptografije. Obradit ćemo RSA i ECDSA potpise, osnove SSL/TLS protokola i ulogu certifikacijskih tijela (Certificate Authorities), a također ćemo pokazati kako generirati samopotpisane certifikate pomoću OpenSSL alata.


1. Uvod i Teorijski Pregled

1.1 Digitalni Potpisi i Provjera Integriteta

Digitalni potpisi koriste asimetričnu kriptografiju za potvrdu autentičnosti poruke ili dokumenta.
-Integritet: Digitalnim potpisom se osigurava da sadržaj poruke nije mijenjan nakon što je potpisan.
-Autentičnost: Potpis potvrđuje identitet pošiljatelja, jer samo on posjeduje privatni ključ potreban za generiranje potpisa.

1.2 RSA i ECDSA Potpisi

-RSA potpisi: Temelje se na RSA algoritmu, gdje se koristi par ključeva (javni i privatni). Poruka se potpisuje privatnim ključem, a provjera se vrši javnim ključem. -ECDSA potpisi: Koriste eliptične krivulje (npr. SECP256R1) za generiranje digitalnih potpisa. ECC (Eliptic Curve Cryptography) nudi sličnu razinu sigurnosti kao RSA, ali s kraćim ključevima, što je pogodno za uređaje s ograničenim resursima.

1.3 SSL/TLS i Certifikacijska Tijela

-SSL/TLS: Protokoli koji omogućuju siguran prijenos podataka preko interneta. Digitalni certifikati, izdani od strane pouzdanih certifikacijskih tijela (CA), služe za potvrdu identiteta poslužitelja i uspostavu sigurne veze. -Certifikati: Sadrže javni ključ i identitet poslužitelja, te su digitalno potpisani od strane CA. Samopotpisani certifikati mogu se koristiti u testnim okruženjima.

1.4 Generiranje Samopotpisanih Certifikata

Alat OpenSSL omogućuje generiranje samopotpisanih certifikata koji se mogu koristiti za razvoj i testiranje sigurnosnih aplikacija.


2. Praktični Primjeri u Pythonu

2.1 RSA Digitalni Potpis s Bibliotekom cryptography

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes, serialization

# Generiranje RSA ključeva
privatni_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
javni_key = privatni_key.public_key()

# Poruka za potpisivanje
poruka = b"Ovo je poruka koja se digitalno potpisuje"

# Potpisivanje poruke koristeći privatni ključ
potpis = privatni_key.sign(
    poruka,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)
print("RSA digitalni potpis:", potpis.hex())

# Verifikacija potpisa koristeći javni ključ
try:
    javni_key.verify(
        potpis,
        poruka,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("RSA potpis je ispravan!")
except Exception as e:
    print("RSA potpis nije ispravan:", e)

3. Zadaci za Samostalnu Vježbu

RSA Digitalni Potpis i Verifikacija:
    Napišite skriptu koja:
        Generira RSA par ključeva koristeći cryptography.
        Prima unos poruke od korisnika.
        Potpisuje poruku privatnim ključem.
        Verificira potpis pomoću javnog ključa.
    Usporedite izlaz potpisa s različitim porukama.

ECDSA Potpis s Mrežnom Komunikacijom:
    Kreirajte dvije skripte koje komuniciraju putem socketa:
        Skripta 1 (Pošiljatelj): Generira ECC par ključeva, potpisuje poruku i šalje poruku zajedno s potpisom i javnim ključem.
        Skripta 2 (Primatelj): Prima poruku, potpis i javni ključ, te verificira potpis.
    Osigurajte da se primljena poruka može provjeriti u realnom vremenu.

SSL/TLS Simulacija s Samopotpisanim Certifikatom:
    Koristeći OpenSSL, generirajte samopotpisani certifikat.
    Implementirajte jednostavnu HTTPS poslužiteljsku skriptu u Pythonu (npr. koristeći modul http.server s SSL podrškom) koja koristi generirani certifikat.
    Kreirajte klijentsku skriptu koja se spaja na poslužitelja putem HTTPS-a i provjerava valjanost certifikata.

Integrirani Projekt – Digitalni Potpisi u Sigurnoj Komunikaciji:
    Osmislite mrežnu aplikaciju u kojoj se koristi digitalni potpis za autentikaciju poruka:
        Pošiljatelj enkriptira i potpisuje poruku (koristeći RSA ili ECDSA) te je šalje putem socketa.
        Primatelj dekriptuje i verificira potpis poruke.
    Analizirajte slučajeve kada potpis nije ispravan i implementirajte odgovarajuće obavijesti.