Sobes.tech
Senior

Kaip vyksta informacijos šifravimas Diffie-Hellman algoritme?

sobes.tech AI

Atsakymas iš AI

Šifravimas kaip toks nėra tiesioginė Diffie-Hellman algoritmo funkcija. Jo pagrindinis tikslas yra saugi kriptografinių raktų keitimosi būdas per atvirą kanalą. Šis bendras slaptažodis vėliau gali būti naudojamas simetriniam duomenų šifravimui.

Raktų keitimosi procesas atrodo taip:

  1. Bendrų prieinamų parametrų pasirinkimas: Du šalių (Alisa ir Bobas) sutaria dėl didelio pirminio skaičiaus p ir pagrindinio skaičiaus g (ciklinės grupės generatoriaus Zₚ*). g turi būti pirminis šaknies modulo p.
  2. Slaptų skaičių generavimas: Kiekviena šalis generuoja savo slaptą atsitiktinį skaičių. Alisa pasirenka a, Bobas — b. a ir b lieka slaptai.
  3. Bendrų raktų skaičiavimas:
    • Alisa apskaičiuoja A = g^a mod p.
    • Bobas apskaičiuoja B = g^b mod p.
    • A ir B yra vieši raktai ir gali būti saugiai siunčiami per atvirą kanalą.
  4. Bendro slapto rakto skaičiavimas:
    • Alisa gauna B iš Bobo ir skaičiuoja bendrą slapto rakto S = B^a mod p.
    • Bobas gauna A iš Alisos ir skaičiuoja bendrą slapto rakto S = A^b mod p.

Matematiškai (g^b mod p)^a mod p = g^(b*a) mod p ir (g^a mod p)^b mod p = g^(a*b) mod p. Kadangi a*b = b*a, abi šalys skaičiuoja tą pačią reikšmę S, kuri tampa jų bendru slaptažodžiu.

# Pavyzdys Python
import random

# 1. Bendrų prieinamų parametrų pasirinkimas (praktikoje naudojami daug didesni skaičiai)
p = 23
g = 5

print(f"Bendrų prieinamų parametrų: p = {p}, g = {g}")

# 2. Slaptų skaičių generavimas
a = random.randint(2, p - 2) # Alisos slapta reikšmė
b = random.randint(2, p - 2) # Bobo slapta reikšmė

print(f"Alisos slapta reikšmė: {a}")
print(f"Bobo slapta reikšmė: {b}")

# 3. Bendrų raktų skaičiavimas
A = pow(g, a, p) # Alisos viešas raktas: g^a mod p
B = pow(g, b, p) # Bobo viešas raktas: g^b mod p

print(f"Alisos viešas raktas: {A}")
print(f"Bobo viešas raktas: {B}")

# 4. Bendro slapto rakto skaičiavimas
# Alisa skaičiuoja: B^a mod p
shared_key_alice = pow(B, a, p)

# Bobo skaičiuoja: A^b mod p
shared_key_bob = pow(A, b, p)

print(f"Bendras slapta rakto (Alisa): {shared_key_alice}")
print(f"Bendras slapta rakto (Bobo): {shared_key_bob}")

# Patikrinimas: raktai turi sutapti
print(f"Raktai sutampa: {shared_key_alice == shared_key_bob}")

Po sėkmingo rakto keitimosi abi šalys gali naudoti gautą S kaip raktą simetriniam šifravimui (pvz., AES, DES) ir siųsti užšifruotas žinutes. Paties Diffie-Hellman neatlieka duomenų šifravimo. Jis sprendžia jų saugaus rakto keitimosi problemą, o vėliau pereina prie simetrinio šifravimo.