7.1. PQXDH ile entegrasyon
Bu belgede açıklanan tüm ratchet protokolleri; Double Ratchet, Sparse Post-Quantum Ratchet ve Triple Ratchet, PQXDH anahtar anlaşma protokolü [1] ile birlikte kullanılabilir. Ratchet protokolü burada, PQXDH tarafından uzlaşılan oturum anahtarı SK'yi alan ve bunu başlangıç kök anahtar(lar)ını türetmek için kullanan bir "PQXDH sonrası" protokol rolünü oynar.
PQXDH'den gelen aşağıdaki çıktılar ratchet protokollerinde kullanılır:
PQXDH'den gelen SK çıktısı, Double Ratchet başlatmasının (bkz. Bölüm 3.3) veya Sparse Post-Quantum Ratchet başlatmasının (bkz. Bölüm 5.4) SK girdisi olur. Triple Ratchet için PQXDH'den gelen SK çıktısı, bir anahtar türetme işlevi kullanılarak 32 baytlık iki anahtara, SKec ve SKscka'ya genişletilmeli ve Triple Ratchet başlatmasına girdi olarak kullanılmalıdır (bkz. Bölüm 6.4).
PQXDH'den gelen AD çıktısı, ratchet protokolü şifreleme ve şifre çözme işlemlerinin AD girdisi olur (bkz. Bölüm 3.4 ve Bölüm 3.5).
PQXDH'deki Bob'a ait imzalı ön anahtar (SPK_B), Double Ratchet başlatması için Bob'un başlangıç ratchet açık anahtarı (ve buna karşılık gelen anahtar çifti) olur.
Herhangi bir mesaj alınmadan önce Alice'in başlangıç ratchet protokolü durumu kullanılarak şifrelenmiş herhangi bir mesaj, PQXDH için bir "başlangıç şifreli metni" işlevi görebilir. Kaybolan veya sırası bozuk gelen mesaj olasılığını ele almak için önerilen desen şudur: Alice, Bob'dan ilk ratchet protokolü yanıt mesajını alana kadar aynı PQXDH başlangıç mesajını kendi tüm ratchet protokolü mesajlarının önüne ekleyerek tekrar tekrar gönderir.
7.2. Önerilen kriptografik algoritmalar
Aşağıdaki seçimler, Bölüm 3.1, Bölüm 5.2 ve Bölüm 6.3'teki kriptografik işlevleri somutlaştırmak için önerilir. Sırasıyla Sparse Post-Quantum Ratchet ve Triple Ratchet tarafından kullanılan işlevler, kullanılan protokolü ve sürümü benzersiz biçimde tanımlaması gereken SPQR_PROTOCOL_INFO ve TR_PROTOCOL_INFO sabit dizgilerine dayanır.
GENERATE_DH(): Bu işlevin, Curve25519 veya Curve448 eliptik eğrilerine dayalı bir anahtar çifti üretmesi önerilir [12].
DH(dh_pair, dh_pub): Bu işlevin, [12]'de tanımlandığı şekliyle X25519 veya X448 işlevinin çıktısını döndürmesi önerilir. Geçersiz açık anahtarları denetlemeye gerek yoktur.
KDF_RK(rk, dh_out): Bu işlevin, HKDF [3] ile SHA-256 veya SHA-512 [13] kullanılarak şu şekilde gerçekleştirilmesi önerilir: HKDF salt olarak rk, HKDF input key material olarak dh_out ve HKDF info olarak uygulamaya özgü bir bayt dizisi kullanılır. info değeri, uygulamadaki diğer HKDF kullanımlarından farklı olacak şekilde seçilmelidir.
KDF_CK(ck): HMAC [2] ile SHA-256 veya SHA-512 [13] kullanımı önerilir; burada ck HMAC anahtarı olarak kullanılır ve girdi olarak ayrı sabitler kullanılır (örneğin mesaj anahtarını üretmek için tek baytlık 0x01, sonraki zincir anahtarını üretmek için tek baytlık 0x02). Eğer ck, None ise bu işlev işlemeyi sonlandıracak şekilde başarısız olmalıdır.
ENCRYPT(mk, plaintext, associated_data): Bu işlevin, SIV tabanlı ya da CBC ile HMAC bileşiminden oluşan bir AEAD şifreleme şeması [5], [14] ile gerçekleştirilmesi önerilir. Bu şemalar, bir anahtar yanlışlıkla birden fazla kez kullanıldığında belirli bir hatalı kullanım dayanıklılığı sağlar. CBC ve HMAC temelli somut bir öneri şöyledir:
HKDF, SHA-256 veya SHA-512 ile 80 bayt çıktı üretmek için kullanılır. HKDF salt değeri, özet işlevinin çıktı uzunluğuna eşit, sıfırlarla doldurulmuş bir bayt dizisi olarak ayarlanır. HKDF input key material değeri mk olarak ayarlanır. HKDF info değeri ise uygulamadaki diğer HKDF kullanımlarından farklı olan, uygulamaya özgü bir bayt dizisi olarak ayarlanır.
HKDF çıktısı, 32 baytlık bir şifreleme anahtarına, 32 baytlık bir doğrulama anahtarına ve 16 baytlık bir IV'ye ayrılır.
Düz metin, bir önceki adımdan gelen şifreleme anahtarı ve IV kullanılarak PKCS#7 dolgulamalı CBC kipinde AES-256 ile şifrelenir [15], [16].
HMAC, doğrulama anahtarı ve yukarıdakiyle aynı özet işlevi kullanılarak hesaplanır [2]. HMAC girdisi, associated_data'nın şifreli metnin önüne eklenmiş halidir. HMAC çıktısı şifreli metnin sonuna eklenir.
SCKA: Hibrit kuantum sonrası güvenlik için, bu protokolün [9]'da açıklanan ML-KEM Braid protokolü olması önerilir.
KDF_SCKA_INIT(sk): Bu işlevin, HKDF [3] ile SHA-256 veya SHA-512 [13] kullanılarak ve aşağıdaki parametrelerle gerçekleştirilmesi önerilir:
- salt: sıfırlarla doldurulmuş 32 bayt
- ikm: sk
- info: Protokolü ve sürümü belirten benzersiz bir sabit, ardından "Chain Start"
- length: 96
KDF_SCKA_RK(rk, scka_out): Bu işlevin, HKDF [3] ile SHA-256 veya SHA-512 [13] kullanılarak ve aşağıdaki parametrelerle gerçekleştirilmesi önerilir:
- salt: rk
- ikm: scka_output
- info: SPQR_PROTOCOL_INFO, ardından "Chain Add Epoch"
- length: 96
KDF_SCKA_CK(ck, ctr): Bu işlevin, HKDF [3] ile SHA-256 veya SHA-512 [13] kullanılarak ve aşağıdaki parametrelerle gerçekleştirilmesi önerilir:
- salt: sıfırlarla doldurulmuş 32 bayt
- ikm: sk
- info: SPQR_PROTOCOL_INFO, ardından "Chain Start"
- length: 64
KDF_HYBRID(ec_mk, scka_mk): Bu işlevin, HKDF [3] ile SHA-256 veya SHA-512 [13] kullanılarak ve aşağıdaki parametrelerle gerçekleştirilmesi önerilir:
- salt: scka_mk
- ikm: ec_mk
- info: TR_PROTOCOL_INFO
- length: AEAD tarafından gereken anahtar uzunluğu.