2.1. KDF zincirleri
Bir KDF zinciri, Double Ratchet algoritmasındaki temel kavramlardan biridir.
Bir KDF'yi, gizli ve rastgele bir KDF anahtarı ile bazı girdi verilerini alıp çıktı verileri döndüren kriptografik bir işlev olarak tanımlarız. Anahtar bilinmediği sürece çıktı verileri rastgele veriden ayırt edilemez durumdadır (yani bir KDF, kriptografik bir "PRF" için gereken koşulları sağlar). Anahtar gizli ve rastgele değilse bile, KDF yine de kendi anahtarı ve girdi verileri üzerinde güvenli bir kriptografik özet sağlamalıdır. HMAC ve HKDF yapıları, güvenli bir özet algoritmasıyla somutlaştırıldıklarında KDF tanımını karşılar [2], [3].
Bir KDF'den elde edilen çıktının bir kısmı çıktı anahtarı olarak kullanılırken bir kısmı da KDF anahtarının yerine geçirilip başka bir girdiyle birlikte kullanılabiliyorsa buna KDF zinciri deriz. Aşağıdaki diyagram, üç girdiyi işleyen ve üç çıktı anahtarı üreten bir KDF zincirini göstermektedir:
(KDF anahtarı)
|
v
(Girdi)-->[ KDF ]
| \
v v
(KDF anahtarı) (Çıktı anahtarı)
|
v
(Girdi)-->[ KDF ]
| \
v v
(KDF anahtarı) (Çıktı anahtarı)
|
v
(Girdi)-->[ KDF ]
| \
v v
(KDF anahtarı) (Çıktı anahtarı)
Bir KDF zinciri aşağıdaki özelliklere sahiptir ([4]'ten uyarlanmış terminoloji kullanılarak):
Dayanıklılık: KDF anahtarlarını bilmeyen bir saldırgana çıktı anahtarları rastgele görünür. Bu, saldırgan KDF girdilerini denetleyebilse bile geçerlidir.
İleriye dönük güvenlik: Geçmişteki çıktı anahtarları, belirli bir anda KDF anahtarını öğrenen bir saldırgana rastgele görünür.
İhlal sonrası toparlanma: Belirli bir anda KDF anahtarını öğrenen bir saldırgana gelecekteki çıktı anahtarları rastgele görünür; yeter ki gelecekteki girdiler yeterli entropi eklesin.
Alice ile Bob arasındaki bir Double Ratchet oturumunda, her taraf üç zincir için birer KDF anahtarı saklar: bir kök zinciri, bir gönderme zinciri ve bir alma zinciri (Alice'in gönderme zinciri Bob'un alma zinciriyle eşleşir ve tersi de geçerlidir).
Alice ile Bob mesaj alışverişi yaptıkça yeni Diffie-Hellman açık anahtarları da paylaşırlar ve Diffie-Hellman çıktı sırları kök zincirinin girdileri haline gelir. Kök zincirinden çıkan çıktı anahtarları, gönderme ve alma zincirleri için yeni KDF anahtarları olur. Buna Diffie-Hellman ratchet'i denir.
Gönderme ve alma zincirleri, her mesaj gönderildiğinde ve alındığında ilerler. Bunların çıktı anahtarları mesajları şifrelemek ve şifresini çözmek için kullanılır. Buna simetrik anahtar ratchet'i denir.
Sonraki bölümler önce simetrik anahtar ve Diffie-Hellman ratchet'lerini daha ayrıntılı açıklar, ardından bunların nasıl birleştirilerek Double Ratchet'ın elde edildiğini gösterir.
2.2. Simetrik anahtar ratchet'i
Gönderilen veya alınan her mesaj, benzersiz bir mesaj anahtarı ile şifrelenir. Mesaj anahtarları, gönderme ve alma KDF zincirlerinden çıkan çıktı anahtarlarıdır. Bu zincirlerin KDF anahtarlarına zincir anahtarları denecektir.
Gönderme ve alma zincirleri için KDF girdileri sabittir; dolayısıyla bu zincirler ihlal sonrası toparlanma sağlamaz. Gönderme ve alma zincirleri yalnızca her mesajın, şifreleme veya şifre çözme işleminden sonra silinebilecek benzersiz bir anahtarla şifrelenmesini sağlar. Belirli bir zincir anahtarından sonraki zincir anahtarını ve mesaj anahtarını hesaplamak, simetrik anahtar ratchet'i içindeki tek bir ratchet adımıdır. Aşağıdaki diyagram iki adım göstermektedir:
(Zincir anahtarı)
|
v
(Sabit)----->[ KDF ]
| \
v v
(Zincir anahtarı) (Mesaj anahtarı)
|
v
(Sabit)----->[ KDF ]
| \
v v
(Zincir anahtarı) (Mesaj anahtarı)
Mesaj anahtarları başka herhangi bir anahtarı türetmek için kullanılmadığından, mesaj anahtarları diğer mesaj anahtarlarının güvenliğini etkilemeden saklanabilir. Bu, kaybolan veya sırası bozuk gelen mesajları ele almak açısından yararlıdır (bkz. Bölüm 2.6).
2.3. Diffie-Hellman ratchet'i
Bir saldırgan taraflardan birinin gönderme ve alma zinciri anahtarlarını ele geçirirse, gelecekteki tüm mesaj anahtarlarını hesaplayabilir ve gelecekteki tüm mesajların şifresini çözebilir. Bunu önlemek için Double Ratchet, simetrik anahtar ratchet'ini, zincir anahtarlarını Diffie-Hellman çıktıları temelinde güncelleyen bir DH ratchet'i ile birleştirir.
DH ratchet'ini uygulamak için her taraf bir DH anahtar çifti (bir Diffie-Hellman açık anahtarı ve gizli anahtarı) üretir; bu çift onların güncel ratchet anahtar çifti haline gelir. Taraflardan herhangi birinden gelen her mesaj, gönderenin güncel ratchet açık anahtarını içeren bir başlıkla başlar. Karşı taraftan yeni bir ratchet açık anahtarı alındığında, yerel tarafın güncel ratchet anahtar çiftini yeni bir anahtar çiftiyle değiştiren bir DH ratchet adımı gerçekleştirilir.
Bu, tarafların sırayla ratchet anahtar çiftlerini değiştirdiği bir "ping-pong" davranışı ortaya çıkarır. Taraflardan birini kısa süreliğine ele geçiren bir dinleyici, güncel ratchet gizli anahtarının değerini öğrenebilir; ancak bu gizli anahtar sonunda ele geçirilmemiş başka bir anahtarla değiştirilir. O noktada, ratchet anahtar çiftleri arasındaki Diffie-Hellman hesabı, saldırganın bilmediği bir DH çıktısı tanımlar.
Aşağıdaki diyagramlar, DH ratchet'inin ortak bir DH çıktı dizisini nasıl türettiğini göstermektedir.
Alice, Bob'un ratchet açık anahtarıyla başlatılır. Alice'in ratchet açık anahtarı henüz Bob tarafından bilinmemektedir. Başlatmanın bir parçası olarak Alice, kendi ratchet gizli anahtarı ile Bob'un ratchet açık anahtarı arasında bir DH hesabı yapar:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
|
v
(DH)----> DH çıktısı
|
[Gizli anahtar|Açık anahtar]
Alice'in ilk mesajları kendi ratchet açık anahtarını duyurur. Bob bu mesajlardan birini alınca bir DH ratchet adımı gerçekleştirir: Alice'in ratchet açık anahtarı ile kendi ratchet gizli anahtarı arasındaki DH çıktısını hesaplar; bu değer Alice'in ilk DH çıktısına eşittir. Bob daha sonra kendi ratchet anahtar çiftini değiştirir ve yeni bir DH çıktısı hesaplar:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
|
DH çıktısı <--(DH)
|
[Açık anahtar|Gizli anahtar]
Bob'un yeni ratchet anahtar çifti
Bob'un DH ratchet adımı
Bob tarafından gönderilen mesajlar onun yeni açık anahtarını duyurur. Bir süre sonra Alice, Bob'un mesajlarından birini alacak ve bir DH ratchet adımı gerçekleştirerek kendi ratchet anahtar çiftini değiştirecek ve biri Bob'unkinin en güncel değeriyle eşleşen, diğeri yeni olan iki DH çıktısı türetecektir:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Açık anahtar] <--- - - - - - - [Açık anahtar|Gizli anahtar]
|
v
(DH)----> DH çıktısı
|
[Gizli anahtar|Açık anahtar]
Alice'in DH ratchet adımı
Alice tarafından gönderilen mesajlar onun yeni açık anahtarını duyurur. Sonunda Bob bu mesajlardan birini alacak ve ikinci bir DH ratchet adımı gerçekleştirecektir; süreç bu şekilde devam eder:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Açık anahtar] <--- - - - - - - [Açık anahtar|Gizli anahtar]
| |
v v
(DH)----> DH çıktısı = DH çıktısı <---(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
|
DH çıktısı <--(DH)
|
[Açık anahtar|Gizli anahtar]
Bob'un DH ratchet adımı
Her DH adımında üretilen çıktılar, yeni gönderme ve alma zinciri anahtarlarını türetmek için kullanılır. Aşağıdaki diyagram Bob'un ilk adımını yeniden gösterir. Bob ilk DH çıktısını, Alice'in gönderme zinciriyle eşleşen bir alma zinciri elde etmek için kullanır. İkinci DH çıktısı ise yeni bir gönderme zinciri için kullanılır:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
| |
v v
(DH)--> Gönderme zinciri = Alma zinciri <--(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
|
Gönderme zinciri <--(DH)
|
[Açık anahtar|Gizli anahtar]
Taraflar sırayla DH ratchet adımları gerçekleştirdikçe, sırayla yeni gönderme zincirleri devreye sokarlar:
Alice Bob
____________ ___________________
|Açık anahtar|Gizli anahtar|
[Açık anahtar] <--- - - - - - - - +-------+---------+
| |
v v
(DH)--> Gönderme zinciri = Alma zinciri <--(DH)
| |
[Gizli anahtar|Açık anahtar] - - - - -> [Açık anahtar]
| |
v v
(DH)-> Alma zinciri = Gönderme zinciri <--(DH)
| |
[Açık anahtar] <--- - - - - - - [Açık anahtar|Gizli anahtar]
|
v
(DH)--> Gönderme zinciri
|
[Gizli anahtar|Açık anahtar]
Ancak yukarıdaki şekil bir sadeleştirmedir. Zincir anahtarlarını doğrudan DH çıktılarından almak yerine, DH çıktıları bir kök zincirine KDF girdileri olarak kullanılır ve kök zincirinden çıkan KDF çıktıları gönderme ve alma zinciri anahtarları olarak kullanılır. Burada bir KDF zinciri kullanmak, dayanıklılığı ve ihlal sonrası toparlanmayı iyileştirir.
Dolayısıyla tam bir DH ratchet adımı, kök KDF zincirinin iki kez güncellenmesinden ve KDF çıktı anahtarlarının yeni alma ve gönderme zinciri anahtarları olarak kullanılmasından oluşur:
(Kök anahtarı)
[Gizli anahtar|Açık anahtar] |
| |
(DH)---------------->[ KDF ]
| | \
[Açık anahtar] <-- v v
| (Kök anahtarı) (Alma zinciri anahtarı)
v |
(DH)---------------->[ KDF ]
| | \
[Gizli anahtar|Açık anahtar] v v
(Kök anahtarı) (Gönderme zinciri anahtarı)
2.4. Double Ratchet
Simetrik anahtar ve DH ratchet'lerinin birleştirilmesiyle Double Ratchet elde edilir:
Bir mesaj gönderildiğinde veya alındığında, mesaj anahtarını türetmek için gönderme ya da alma zincirine bir simetrik anahtar ratchet adımı uygulanır.
Yeni bir ratchet açık anahtarı alındığında, zincir anahtarlarını değiştirmek için simetrik anahtar ratchet'inden önce bir DH ratchet adımı gerçekleştirilir.
Aşağıdaki diyagramda Alice, Bob'un ratchet açık anahtarı ve başlangıç kök anahtarı olan paylaşılan bir sır ile başlatılmıştır. Başlatmanın bir parçası olarak Alice yeni bir ratchet anahtar çifti üretir ve yeni bir kök anahtarı (RK) ile gönderme zinciri anahtarını (CK) hesaplamak için DH çıktısını kök KDF'ye verir:
Ratchet | Kök | Gönderme | Alma
| | |
[A]<--- | (RK) | |
o | | | |
|---->[ ]--->[ ] | |
[A|a] | RK CK | |
| | |
| Eski anahtarlar silinebilir
Alice ilk mesajı olan A1'i gönderdiğinde, gönderme zinciri anahtarına bir simetrik anahtar ratchet adımı uygular; bunun sonucunda yeni bir mesaj anahtarı elde edilir (mesaj anahtarları, şifreledikleri veya şifresini çözdükleri mesajla etiketlenecektir). Yeni zincir anahtarı saklanır, ancak mesaj anahtarı ve eski zincir anahtarı silinebilir:
Ratchet | Kök | Gönderme | Alma
| | |
[A]<--- | (RK) | |
o | | | |
|---->[ ]--->[ ] | |
[A|a] | RK CK |
| |[ ] | Simetrik anahtar
| CK A1 | ratchet'i
| | |
| Eski anahtarlar silinebilir
Alice daha sonra Bob'dan B1 yanıtını alırsa, bu mesaj yeni bir ratchet açık anahtarı içerecektir (Bob'un açık anahtarları ilk kez alındıkları mesajla etiketlenir). Alice yeni alma ve gönderme zinciri anahtarları türetmek için bir DH ratchet adımı uygular. Ardından aldığı mesaj için mesaj anahtarını elde etmek üzere alma zincirine bir simetrik anahtar ratchet adımı uygular:
Ratchet | Kök | Gönderme | Alma
| | |
[A]<--- | (RK) | |
o | | | |
|---->[ ]--->[ ] | |
[A|a] | RK CK |
| |[ ] |
| CK A1 |
o---->[ ] | | | |
| | | [ ] | CK
(B1)<-- | RK CK | |[ ]
o---->[ ] | | | CK B1
| | | [ ] | |
[b|B] |RK CK | |
| | |
DH ratchet'i | | Simetrik anahtar ratchet'i
Alice'in daha sonra A2 mesajını gönderdiğini, Bob'un eski ratchet açık anahtarını içeren B2 mesajını aldığını ve ardından A3 ile A4 mesajlarını gönderdiğini varsayalım. Alice'in gönderme zinciri üç adım, alma zinciri ise bir adım ilerlemiş olacaktır:
Ratchet | Kök | Gönderme | Alma
| | |
[A]<--- | (RK) | |
o | | | |
|---->[ ]--->[ ] | |
[A|a] | RK CK |
| |[ ] |
| CK A1 |
o---->[ ] | | | |
| | | [ ] | CK
(B1)<-- | RK CK | |[ ]
o---->[ ] | | | CK B1
| | | [ ] |[ ] |[ ]
[b|B] |RK CK A2 CK B2
| |[ ] |
| CK A3 3 adım | 1 adım
| |[ ] |
| CK A4 |
Alice'in daha sonra Bob'un sonraki ratchet anahtarıyla gelen B3 ve B4 mesajlarını aldığını, ardından A5 mesajını gönderdiğini varsayalım. Alice'in son durumu şu şekilde olacaktır:
Ratchet | Kök | Gönderme | Alma
| | |
[A]<--- | (RK) | |
o | | | |
|---->[ ]--> [ ] | |
[A|a] | RK CK |
| |[ ] |
| CK A1 |
o---->[ ] | | | |
(B1)<-- | [ ] | CK
o---->[ ] | | |[ ] |[ ]
[b|B] |RK CK A2 CK B1
| |[ ] |[ ]
| CK A3 CK B2
| |[ ] |
| CK A4 |
o---->[ ] | | |
(B3)<-- |[ ] |
o---->[ ] || CK
[d|D] |RK CK |[ ]
| | CK B3
| |[ ] |[ ]
| CK A5 CK B4
B3'ten önce
2.6. Sırası bozuk mesajlar
Double Ratchet, kaybolan veya sırası bozuk gelen mesajları, her mesaj başlığına mesajın gönderme zinciri içindeki numarasını (N=0,1,2,...) ve önceki gönderme zincirinin uzunluğunu (mesaj anahtarı sayısı) (PN) ekleyerek ele alır. Bu, alıcının ilgili mesaj anahtarına ilerlemesini sağlarken atlanan mesaj anahtarlarını, atlanan mesajlar daha sonra gelirse diye saklamasını mümkün kılar.
Bir mesaj alındığında, eğer bir DH ratchet adımı tetiklenirse, alınan PN değerinden mevcut alma zincirinin uzunluğu çıkarıldığında bu, o alma zincirindeki atlanan mesaj sayısını verir. Alınan N değeri ise yeni alma zincirindeki (yani DH ratchet'inden sonraki zincirdeki) atlanan mesaj sayısıdır.
Eğer bir DH ratchet adımı tetiklenmezse, alınan N değerinden alma zincirinin uzunluğu çıkarıldığında bu, o zincirdeki atlanan mesaj sayısını verir.
Örnek olarak, önceki bölümdeki mesaj dizisinde B2 ve B3 mesajlarının atlandığını düşünelim. B4 mesajı Alice'in DH ratchet adımını tetikleyecektir (B3 yerine). B4 mesajında PN=2 ve N=1 olacaktır. Alice, B4 mesajını aldığında uzunluğu 1 olan bir alma zincirine (B1) sahip olacaktır; dolayısıyla daha sonra gelirlerse şifreleri çözülebilsin diye B2 ve B3 için mesaj anahtarlarını saklayacaktır:
Ratchet | Kök | Gönderme | Alma
| | |
[b|B] | RK | CK | CK
| | |[ ] | |[ ]
| |CK A2 |CK (B1)
| | |[ ] |--- - - -+
| |CK A3 |(B2) |
B4'ten | | |[ ] | |
önce | |CK A4 | Atlanan |
- - - - - + - - - -+ - - - - - + mesaj +
o-->[ ] | | | | anahtarları |
(B4)<- | [ ] | CK |
o-->[ ] | | | |[ ] |
[d|D] | RK CK CK (B3)---+
| | |[ ]
| | CK B4
| | |