← Double Ratchet
Bölüm 6 / 10

6. Triple Ratchet

Bu bölüm Triple Ratchet protokolünü açıklamaktadır.

Double Ratchet, belirli Diffie-Hellman varsayımlarının zor olması koşuluyla güvenlik güvenceleri sağlar [7], [10], [11]. Benzer şekilde, kuantum güvenli bir SCKA protokolüne dayanan Sparse Post-Quantum Ratchet da kuantum sonrası güvenlik güvenceleri sağlar [8]. Bu bölümde bunların, hibrit güvenlik sağlayan tek bir protokolde nasıl birleştirileceğini açıklıyoruz: protokolün güvenlik güvencelerini kırabilmek için bir saldırganın hem eliptik eğri varsayımlarını hem de kuantum sonrası varsayımları kırması gerekir.

6.1. Genel bakış

Hibritleştirme stratejisi basittir: bir Double Ratchet ile bir Sparse Post-Quantum Ratchet'ı paralel olarak çalıştırın, ancak bunları mesajların tam şifrelenmesi veya şifresinin çözülmesi için değil, yalnızca mesaj anahtarları üretmek için kullanın. Böylece, bir şifreleme anahtarı gerektiğinde bu Güvenli Mesajlaşma protokollerinin her birini çağırarak mesaj anahtarları elde edilir ve ardından bu iki mesaj anahtarı bir KDF ile birleştirilerek tek bir şifreleme anahtarı üretilir.

6.2. Durum değişkenleri

Bir Triple Ratchet durumu, bir Double Ratchet durumu ile bir Sparse Post-Quantum Ratchet durumundan oluşur:

  • ec_state: bir Eliptik Eğri Double Ratchet'ın durumu.
  • spqr_state: bir Sparse Post-Quantum Ratchet'ın durumu.

6.3. Dış işlevler

  • KDF_HYBRID(ecmk, pqmk): İki adet 32 baytlık sırrın birleşimiyle anahtarlanmış bir KDF'nin, kullanılan protokolü ve parametrelerini belirten benzersiz bir sabite uygulanmasının sonucu olarak bir AEAD şifreleme anahtarı döndürür.

  • SCKA_HEADER(scka_msg, pn): SPQR'nin temelindeki SCKA protokolünün ürettiği bir mesajı ve önceki zincir uzunluğu pn'yi içeren yeni bir mesaj başlığı oluşturur.

6.4. Başlatma

Başlatmadan önce her iki taraf da, 32 baytlık paylaşılan gizli anahtarlar SKec ve SKscka ile Bob'un ratchet açık anahtarı üzerinde anlaşmak için bir anahtar anlaşma protokolü kullanmalıdır. Bu değerler, Double Ratchet ile Sparse Post-Quantum Ratchet'ı başlatmak için kullanılacaktır.

function RatchetInitAliceTR(state, SKec, SKscka, bob_dh_public_key):
    RatchetInitAlice(state.ec_state, SKec, bob_dh_public_key)
    RatchetInitSCKA(state.spqr_state, SKscka)

function RatchetInitBobTR(state, SKec, SKscka, bob_dh_key_pair):
    RatchetInitBob(state.ec_state, SKec, bob_dh_key_pair)
    RatchetInitSCKA(state.spqr_state, SKscka)

6.5. Mesajların şifrelenmesi

Triple Ratchet mesajları, şu bileşenleri içeren birleşik bir başlık kullanır:

  • ec_header: standart Double Ratchet başlığı (dh, pn, n)
  • scka_header: SCKA mesaj verisi ve metaverisi (msg, n)

Başlık yapısı, her iki bileşenin de belirsizliğe yer bırakmadan ayrıştırılabilmesini sağlamalıdır.

Bir mesajı şifrelemek için, gereken başlık bilgileriyle birlikte her iki ratchet'ten da mesaj anahtarlarını alın; ardından iki mesaj anahtarını güvenli biçimde birleştirerek şifreleme anahtarını üretin.

function TripleRatchetEncrypt(state, plaintext, AD):
    ecNs, ec_mk = RatchetSendKey(state.ec_state)
    scka_msg, pqN, pq_mk = SCKARatchetSendKey(state.spqr_state)
    mk = KDF_HYBRID(ec_mk, pq_mk)
    header.ec_header = HEADER(state.ec_state.DHs, state.ec_state.PN, ecNs)
    header.scka_header = SCKA_HEADER(scka_msg, pqN)
    return header, ENCRYPT(mk, plaintext, CONCAT(AD, header))

6.6. Mesajların şifresinin çözülmesi

function TripleRatchetDecrypt(state, header, ciphertext, AD):
    ec_mk = RatchetReceiveKey(state.ec_state, header.ec_header)
    pq_mk = SCKARatchetReceiveKey(state.spqr_state, header.scka_header)
    mk = KDF_HYBRID(ec_mk, pq_mk)
    return DECRYPT(mk, ciphertext, CONCAT(AD, header))