Sobes.tech
Senior

Jak odbywa się szyfrowanie informacji w algorytmie Diffie-Hellman?

sobes.tech AI

Odpowiedź od AI

Samo szyfrowanie nie jest bezpośrednią funkcją algorytmu Diffie-Hellmana. Jego głównym celem jest bezpieczna wymiana kluczy kryptograficznych przez otwarty kanał. Następnie ten wspólny sekret może być używany do symetrycznego szyfrowania danych.

Proces wymiany kluczy wygląda następująco:

  1. Wybór parametrów publicznych: Dwie strony (Alicja i Bob) uzgadniają dużą liczbę pierwszą p i liczbę bazową g (generator grupy cyklicznej Zₚ*). g musi być pierwiastkiem pierwotnym modulo p.
  2. Generowanie tajnych liczb: Każda strona generuje własną tajną losową liczbę. Alicja wybiera a, Bob wybiera b. a i b pozostają tajne.
  3. Obliczanie kluczy publicznych:
    • Alicja oblicza A = g^a mod p.
    • Bob oblicza B = g^b mod p.
    • A i B są kluczami publicznymi i mogą być bezpiecznie wysyłane przez otwarty kanał.
  4. Obliczanie wspólnego sekretnego klucza:
    • Alicja otrzymuje B od Boba i oblicza S = B^a mod p.
    • Bob otrzymuje A od Alicji i oblicza S = A^b mod p.

Matematycznie (g^b mod p)^a mod p = g^(b*a) mod p i (g^a mod p)^b mod p = g^(a*b) mod p. Ponieważ a*b = b*a, obie strony obliczają tę samą wartość S, która staje się ich wspólnym sekretnym kluczem.

# Przykład w Pythonie
import random

# 1. Wybór parametrów publicznych (w praktyce znacznie większe liczby)
p = 23
g = 5

print(f"Parametry publiczne: p = {p}, g = {g}")

# 2. Generowanie tajnych liczb
a = random.randint(2, p - 2) # Tajna liczba Alicji
b = random.randint(2, p - 2) # Tajna liczba Boba

print(f"Tajna liczba Alicji: {a}")
print(f"Tajna liczba Boba: {b}")

# 3. Obliczanie kluczy publicznych
A = pow(g, a, p) # Klucz publiczny Alicji: g^a mod p
B = pow(g, b, p) # Klucz publiczny Boba: g^b mod p

print(f"Klucz publiczny Alicji: {A}")
print(f"Klucz publiczny Boba: {B}")

# 4. Obliczanie wspólnego sekretnego klucza
# Alicja oblicza: B^a mod p
shared_key_alice = pow(B, a, p)

# Bob oblicza: A^b mod p
shared_key_bob = pow(A, b, p)

print(f"Wspólny sekret (Alicja): {shared_key_alice}")
print(f"Wspólny sekret (Bob): {shared_key_bob}")

# Sprawdzenie: klucze powinny się zgadzać
print(f"Klucze pasują? {shared_key_alice == shared_key_bob}")

Po pomyślnym wymianie kluczy, obie strony mogą używać uzyskanej wartości S jako klucza do algorytmów szyfrowania symetrycznego (np. AES, DES) do późniejszego szyfrowania i deszyfrowania wiadomości. Diffie-Hellman nie wykonuje szyfrowania danych. Rozwiązuje problem bezpiecznej wymiany kluczy do późniejszego symetrycznego szyfrowania.