← Double Ratchet/
Double Ratchet · Bölüm 06 cryptography / double-ratchet

6. Triple Ratchet — Hibrit Güvenlik

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:

6.3. Dış işlevler

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:

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'tan 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))