ECDSA - Eliptic Curve Digital Signature Algorithm
 

Naslovnica

Uvod

ECDSA

Download

Linkovi

 

ECDSA (engl. elliptic curve digital signature algorithm) je algoritam za digitalni potpis poruke koji koristi eliptične krivulje i njihova svojstva.

 

Parametri kriptosustava:

Uređena šestorka D = (q, a, b, P, n, h) predstavlja parametre kriptosustava za koje vrijedi
q = p ili q = 2m , p je prosti broj
         - a, b su elementi polja , određuju jednadžbu eliptične krivulje
         - P je točka na krivulji E, P = (xp, yp)
         - n je red točke P , najmanji pozitivni cijeli broj takav da vrijedi nP = O
         - h
= #E(Fq)/n.

 
         Prethodno navedeni parametri su javni.

 

Izbor parametara:

         Dva su osnovna koraka kod izbora parametara za kriptosustav zasnovan na eliptičkim krivuljama:

  • izbor konačnog polja Fq,

  • izbor eliptičke krivulje E nad Fq.

         Kod izbora polja, dvije su osnovne mogućnosti: ili je q = p prost broj ili q = 2m potencija broja 2. Ako su p i 2m približno iste veličine, ova dva izbora pružaju istu razinu sigurnosti.

         Među poljima Fp, da mi se minimiziralo vrijeme potrebno za modularno množenje, preporuča se da p ima oblik 2k +- c za neki mali prirodni broj c (npr. Mersenneovi prosti brojevi oblika 2k - 1, 2160 + 7, 2255 + 95, i sl.).

         Kod polja karakteristike 2, osim broja elemenata, moramo odabrati i način reprezentacije elemenata. Najčešće se koriste trinomijalne i optimalne normalne baze. Kao što smo ranije napomenuli, izbor takvih baza omogućuje efikasniju implementaciju. No, takve baze ne postoje za svako konačno polje karakteristike 2, pa i to utječe na izbor polja. Neki popularni izbori su npr. 2163, 2191, 2239 i 2431.


         Kod izbora eliptičke krivulje trebamo paziti da problem diskretnog logaritma bude "težak". Kako smo već više puta napomenuli, ECDLP je, prema svemu što vam je danas poznato, vrlo težak problem. Međutim, postoje tipovi eliptičkih krivulja kod kojih je taj problem nešto (ali čak puno) lakši. Zato takve krivulje treba izbjegavati. Situacija je vrlo slična kao kod kriptosustava koji svoju sigurnost zasnivaju na teškoći faktorizacije velikih prirodnih brojeva (npr. RSA ili Rabinov). I tamo je tvrdnja da je broj oblika pq, gdje su p i q veliki prosti brojevi, teško rastaviti na faktore točna samo ako se p i q odaberu pažljivo (npr. p i q ne smiju biti jako bliski; brojevi p - 1 i q - 1 moraju imati barem jedan veliki prosti faktor).

 

         Algoritam:

1. ECDSA generiranje ključeva.
E je eliptička krivulja nad Fp, a P je točka prostog reda n na E(Fp). Svaki korisnik napravi sljedeće:

a) Izabere slučajan broj d iz skupa {1, ... , n - 1};
b) Izračuna Q = [d] P;
c) Q je javni, a d tajni ključ.

2. ECDSA generiranje potpisa.
Kad želi potpisati poruku m, Alice radi sljedeće:

a) Izabere slučajan broj k iz skupa {1, ... , n - 1};
b) Izračuna [k] P = (x1, y1) i r = x1 mod n. Ako je r = 0, onda se vrati na korak a);
c) Izračuna k-1 mod n;
d) Izračuna s = k-1(H(m) + dr) mod n, gdje je H hash funkcija. Ako je s = 0, onda se vrati na korak a);
e) Potpis poruke m je uređeni par prirodnih brojeva (r, s).

3. ECDSA provjera potpisa.
Da bi verificirao Alicein potpis (r, s) poruke m, Bob treba napraviti sljedeće:

a) Dobiti Alicein javni ključ Q;
b) Provjeriti da su r i s cijeli brojevi iz skupa {1, ... , n - 1};
c) Izračunati w = s-1 mod n i H(m);
d) Izračunati u1 = H(m)w mod n i u2 = rw mod n;
e) Izračunati [u1] P + [u2] Q = (x0, y0) i v = x0 mod n;
f) Prihvatiti potpis kao vjerodostojan ako i samo ako je v = r.

 

Programsko ostvarenje:

Algoritam je ostvaren u programskom jeziku C korištenjem biblioteka GMP i ECC-LIB-2.0.

Korištene funkcije iz biblioteke ECC-LIB-2.0:

void CMmethod(int D, mpz_t * p1, mpz_t * m1, mpz_t * curv)
         -vraca red p1 konacnog polja, elipticku krivulju curv i njezin red m1 na temelju diskriminante D

void domain_parameters(mpz_t * curv, mpz_t * base_point, mpz_t * p, mpz_t * m, mpz_t * n, mpz_t * h)
          -kreira tocku generator reda n i vraca brojeve n i h, gdje je n*h=m(red krivulje)

void create_priv_and_public(mpz_t * curv, mpz_t * p, mpz_t * base, mpz_t * my_private, mpz_t * my_public)
          -kreira privatni i javni kljuc koristeci tocku generator

void print_curve(mpz_t * curv)
          -ispisuje krivulju

void print_point(mpz_t * point)
          -ispisuje tocku

void add_point(mpz_t * curv, mpz_t * p1, mpz_t * p2, mpz_t * p3, mpz_t * p)
          -zbraja 2 tocke modulo p

void point_mult(mpz_t * curv, mpz_t * p1, mpz_t * k, mpz_t * result, mpz_t * p)
          -mnozi tocku sa skalarom modulo p

void rand_point(mpz_t * curv, mpz_t * p, mpz_t * base)
          -generira slucajnu tocku na eliptickoj krivulji

 

Izvorni kod programa, izvršna datoteka i biblioteka ECC-LIB-2.0 su dostupni za download unutar .tar paketa: ecdsa.tar

Biblioteka GMP je dostupna na slijedećem linku: http://www.swox.com/gmp

 

sigurnost.zemris.fer.hr