Delphi için E2EE (Uçtan Uca Şifreleme)

· Bileşenler

2026.1.0 sürümünden itibaren E2EE (Uçtan Uca Şifreleme) desteklenmektedir (yalnızca eSeGeCe All-Access aboneleri için).

Uçtan Uca Şifreleme (E2EE), yalnızca iletişim kuran eşlerin değiş tokuş edilen mesajların içeriğini okuyabilmesini sağlar. Mesajları yönlendiren sunucu bile bunları şifresini çözemez. Bu makale, mesajları güvenli bir şekilde değiş tokuş etmek için açık anahtarlı kriptografi kullanarak E2EE'nin iki eş arasında nasıl çalıştığını açıklar.

E2EE Açıklaması

E2EE'nin Temel İlkeleri

İki eşli bir E2EE sisteminde:


Anahtar Materyaline Genel Bakış

Her eşin (örneğin Alice ve Bob) şunlara sahiptir:

Açık ve özel anahtarlar matematiksel olarak birbirine bağlıdır, ancak açık anahtarı bilmek özel anahtarı ortaya çıkarmaz.


Adım 1: Açık Anahtar Değişimi

Şifreli iletişim gerçekleşmeden önce, Alice ve Bob birbirlerinin açık anahtarlarını bilmelidir.

Tipik yaklaşımlar:

Bu değişim güvenliği tehlikeye atmaz, çünkü açık anahtarlar gizli değildir.


Adım 2: Paylaşılan Bir Gizli Anahtar Oluşturma (ECDH)

Mesajları verimli bir şekilde şifrelemek için, Alice ve Bob önce Elliptic Curve Diffie–Hellman (ECDH) kullanarak bir paylaşılan gizli anahtar türetir.

ECDH Kavramsal Olarak Nasıl Çalışır

Eliptik eğrilerin matematiksel özellikleri nedeniyle, hiçbir taraf bu gizli anahtarı asla iletmese de her iki hesaplama da aynı gizli değeri üretir.

Paylaşılan gizli anahtar hiçbir noktada ağ üzerinden gönderilmez.


Adım 3: Simetrik Bir Şifreleme Anahtarı Türetme

Ham ECDH paylaşılan gizli anahtarı doğrudan şifreleme için kullanılmaz. Bunun yerine, bir Anahtar Türetme Fonksiyonu (KDF) aracılığıyla, tipik olarak SHA-256 gibi kriptografik bir hash ile işlenir.

Anahtar türetmenin amacı:


Sonuç, yalnızca Alice ve Bob tarafından bilinen bir simetrik şifreleme anahtarıdır.


Adım 4: Mesajı Şifreleme

Alice, Bob'a bir mesaj göndermek istediğinde:

  1. Alice mesajı baytlara dönüştürür.
  2. Alice mesajı simetrik bir şifre (genellikle AES-GCM) kullanarak şu şekilde şifreler:
    • Türetilen simetrik anahtar
    • Rastgele bir başlatma vektörü (IV)
  3. Alice şifrelenmiş mesajı ve IV'yi sunucu aracılığıyla Bob'a gönderir.

AES-GCM yaygın olarak kullanılır çünkü şunları sağlar:



Adım 5: Mesajın Şifresini Çözme

Bob şifrelenmiş mesajı aldığında:

  1. Bob, ECDH ve aynı KDF'yi kullanarak aynı simetrik anahtarı bağımsız olarak türetir.
  2. Bob, simetrik anahtarı ve IV'yi kullanarak mesajın şifresini çözer.
  3. Kimlik doğrulama başarılı olursa, Bob orijinal düz metni elde eder.

Mesaj değiştirilmişse veya yanlış anahtar kullanılmışsa, şifre çözme başarısız olur.


Sunucunun Rolü

Bu mimaride sunucu:


Sunucu şunları yapamaz:


Bu, Uçtan Uca Şifrelemenin tanımlayıcı özelliğidir.


Özet

İki eş arasındaki Uçtan Uca Şifreleme, aşağıdakileri birleştirerek çalışır:

  1. Açık anahtarlı kriptografi (anahtar anlaşması için)
  2. Simetrik kriptografi (verimli mesaj şifrelemesi için)
  3. Anahtar türetme fonksiyonları (güvenlik ve doğruluk için)

Sonuç, şöyle bir sistemdir:


Bu model, modern güvenli mesajlaşma sistemlerinin kriptografik bel kemiğidir. 

E2EE Örneği

// ... Create the Server
WSServer := TsgcWebSocketHTTPServer.Create(nil);
WSServer.Port := 80;
WSPE2EE := TsgcWSPServer_E2EE.Create(nil);
WSPE2EE.Server := WSServer;
WSServer.Active := True;
// ... Create 2 clients
WSClient1 := TsgcWebSocketClient.Create(nil);
WSClient1.Host := '127.0.0.1';
WSClient1.Port := 80;
E2EE1 := TsgcWSPClient_E2EE.Create(nil);
E2EE1.Client := WSClient1;
E2EE1.E2EE_Otpions.UserId := 'client-1';
WSClient1.Active := True;
WSClient2 := TsgcWebSocketClient.Create(nil);
WSClient2.Host := '127.0.0.1';
WSClient2.Port := 80;
E2EE2 := TsgcWSPClient_E2EE.Create(nil);
E2EE2.OnE2EEMessageText := OnE2EEMessageTextEvent;
E2EE2.E2EE_Otpions.UserId := 'client-2';
E2EE2.Client := WSClient2;
WSClient2.Active := True;
// ... client-1 send a message to client-2
E2EE1.SendDirectMessage('client-2', 'Hello Client-2');
// ... read the message in the OnE2EEMessageText event
procedure OnE2EEMessageText(Sender: TObject; const aFrom, aText: string);
begin
  DoLog('#direct_message: ' + aText);
end;