Professional Documents
Culture Documents
Raport
Disciplina: Securitatea informațională
Chişinău 2022
Explicațiile algoritmului
Obiectivul semnăturilor digitale este autentificarea și verificarea documentelor și datelor. Acest lucru este
necesar pentru a evita manipularea și modificarea digitală sau falsificarea în timpul transmiterii
documentelor oficiale. Cu o singură excepție, aceștia lucrează pe arhitectura criptografică cu cheie publică.
De obicei, un sistem de cheie asimetrică criptează folosind o cheie publică și decriptează cu o cheie privată.
Pentru semnăturile digitale, însă, este adevărat invers. Semnătura este criptată folosind cheia privată și
decriptată cu cheia publică. Deoarece cheile sunt legate, decodificarea acesteia cu cheia publică verifică
dacă cheia privată adecvată a fost utilizată pentru a semna documentul, verificând astfel proveniența
semnăturii.
Imaginea de mai sus arată întreaga procedură a algoritmului DSA. Se va folosi aici două funcții diferite, o
funcție de semnare și o funcție de verificare. Diferența dintre imaginea unui proces tipic de verificare a
semnăturii digitale este partea de criptare și decriptare. Au parametri diferiți.
A doua parte a algoritmului DSA este generarea și verificarea semnăturii, care pot fi descrise astfel:
Pentru a genera o semnătură de mesaj, expeditorul poate urma acești pași:
Se generează rezumatul mesajului h, folosind un algoritm hash precum SHA1.
Se generează un număr aleator k, astfel încât 0 < k < q.
Se calculează r ca (g**k mod p) mod q. Dacă r = 0, selectați un k diferit.
Se calculează i, astfel încât k*i mod q = 1. i se numește inversul multiplicativ modular al lui k modulo q.
Se calculează s = i*(h+r*x) mod q. Dacă s = 0, selectați un k diferit.
Se împachetează semnătura digitală ca {r,s}.
Pentru a verifica semnătura unui mesaj, destinatarul mesajului și semnătura digitală pot urma acești pași:
Se generează rezumatul mesajului h, folosind același algoritm hash.
Se calculează w, astfel încât s*w mod q = 1. w se numește inversul multiplicativ modular al lui s modulo
q.
Se calculează u1 = h*w mod q.
Se calculează u2 = r*w mod q.
Se calculează v = (((g**u1)*(y**u2)) mod p) mod q.
Dacă v == r, semnătura digitală este validă.
Implementarea DSA
from random import randrange
from hashlib import sha1
from gmpy2 import xmpz, to_binary, invert, powmod, is_prime
while True:
s = xmpz(randrange(1, 2 ** (g)))
a = sha1(to_binary(s)).hexdigest()
zz = xmpz((s + 1) % (2 ** g))
z = sha1(to_binary(zz)).hexdigest()
U = int(a, 16) ^ int(z, 16)
mask = 2 ** (N - 1) + 1
q = U | mask
if is_prime(q, 20):
break
i = 0
j = 2
while i < 4096:
V = []
for k in range(n + 1):
arg = xmpz((s + j + k) % (2 ** g))
zzv = sha1(to_binary(arg)).hexdigest()
V.append(int(zzv, 16))
W = 0
for qq in range(0, n):
W += V[qq] * 2 ** (160 * qq)
W += (V[n] % 2 ** b) * 2 ** (160 * n)
X = W + 2 ** (L - 1)
c = X % (2 * q)
p = X - c + 1
if p >= 2 ** (L - 1):
if is_prime(p, 10):
return p, q
i += 1
j += n + 1
Rezultatul programului: