Skip to main content

βš™οΈ Two Gears Turning

Combined Double Ratchet System​

In 20 minutes: See how symmetric and DH ratchets work together
Prerequisites: Symmetric Key Ratchet + DH Ratchet


🎯 The Simple Story​

The Double Ratchet = 2 ratchets working together!

  1. Symmetric ratchet: Every message β†’ KDF for K_i β†’ β†’ use β†’ delete
  2. DH ratchet: When responding β†’ new DH β†’ update RK β†’ new chain keys

Both ratchets = Maximum forward secrecy!


🧠 Mental Model​

Hold this picture in your head:

Double Ratchet:

Alice sends Message 1:
β”œβ”€ Symmetric ratchet: K1 = KDF_C(CK_A1) β†’ Use β†’ Delete
└─ No DH ratchet (just sending)

Bob responds (Message 2):
β”œβ”€ Symmetric ratchet: K2 = KDF_C(CK_B2) β†’ Use β†’ Delete
└─ DH ratchet triggers:

DH RANCHET (both perform):

Alice: Alice_EK_new, Bob_EK_new_pub
Bob: Bob_EK_new, Alice_EK_new_pub

DH_new = Alice_EK_new Γ— Bob_EK_new

RK_new = KDF(DH_new)
CK_A_new = KDF(RK_new)
CK_B_new = KDF(RK_new)

Alice sends Message 3:
β”œβ”€ Symmetric: K3 = KDF_C(CK_A_new) β†’ Use β†’ Delete
└─ No DH ratchet (already refreshed)

Bob responds (Message 4):
β”œβ”€ Symmetric: K4 = KDF_C(CK_B_new) β†’ Use β†’ Delete
└─ DH ratchet triggers again!

Repeat: DH ratchet only on responses

Think of it like:

βš™οΈ Two gears (Symmetric per message, DH per response)

πŸ”„ Continuous rotation (Never stop both)

πŸ”’ Layered security (One fails? Other protects!)


πŸ“Š See It Happen​

Complete flow:


🎯 Timing of Ratchets​

Symmetric ratchet: Every message (send and receive)

DH ratchet: Only when responding (Bob's turn first)

Msg 1 Alice β†’ Bob: Symmetric ratchet (K1)
Msg 2 Bob β†’ Alice: Symmetric ratchet (K2) + DH ratchet (update RK)
Msg 3 Alice β†’ Bob: Symmetric ratchet (K3)
Msg 4 Bob β†’ Alice: Symmetric ratchet (K4) + DH ratchet (update RK again)
Msg 5 Alice β†’ Bob: Symmetric ratchet (K5)
...

πŸ”’ The Math​

Combined Algorithm​

# Initial state (after X3DH)
RK

# Message 1 (Alice β†’ Bob):
K1 = KDF_C(CK_A1)
Encrypt(msg1, K1) β†’ ciphertext1
Delete K1

# Message 2 (Bob β†’ Alice):
# Bob wants to respond β†’ trigger DH ratchet

# DH ratchet
Bob_EK_private, Bob_EK_public ← Generate
Alice_EK_public ← from ciphertext1 metadata

DH_new = Bob_EK_private Γ— Alice_EK_public
RK_new = KDF(DH_new)
CK_A_new = KDF(RK_new)
CK_B_new = KDF(RK_new)

# Delete old RK, CK_A, CK_B

# Now symmetric ratchet
K2 = KDF_C(CK_B_new)
Encrypt(msg2, K2) β†’ ciphertext2
Delete K2

# Message 3 (Alice β†’ Bob):
# No DH response, just symmetric
K3 = KDF_C(CK_A_new)
Encrypt(msg3, K3) β†’ ciphertext3
Delete K3

# Message 4 (Bob β†’ Alice):
# Bob responding again β†’ DH ratchet

# DH ratchet again (same process)
Bob_EK_private_2, Bob_EK_public_2 ← Generate
Alice_EK_public_2 ← from ciphertext3 metadata

DH_new_2 = Bob_EK_private_2 Γ— Alice_EK_public_2
RK_new_2 = KDF(DH_new_2)
CK_A_new_2 = KDF(RK_new_2)
CK_B_new_2 = KDF(RK_new_2)

# Delete old RK_new, CK_A, CK_B

K4 = KDF_C(CK_B_new_2)
Encrypt(msg4, K4) β†’ ciphertext4
Delete K4

πŸ’‘ Why Both Ratchets?​

Symmetric Ratchet Benefits​

  • Efficient (no DH per message)
  • Fast (KDF vs DH expensive)
  • Works for every message

DH Ratchet Benefits​

  • Fresh keys regularly (post-compromise security)
  • Recover from compromise (limited damage)
  • Adds entropy regularly

Combined​

βœ… Every message has new key (symmetric)
βœ… Compromise limited (DH on responses)
βœ… Efficient and fast
βœ… Maximum forward secrecy


βœ… Quick Check​

Why both ratchets?

Complementary benefits:

Symmetric: Efficient, per message DH: Fresh keys regularly, post-compromise

Combined: Best of both!

When does DH ratchet trigger?

Only on responses:

Msg 1 (Alice→Bob): No DH Msg 2 (Bob→Alice): DH ratchet triggers (Bob responds) Msg 3 (Alice→Bob): No DH Msg 4 (Bob→Alice): DH ratchet triggers (Bob responds)


πŸ“‹ Key Takeaways​

βœ… Symmetric ratchet: Every message β†’ K_i
βœ… DH ratchet: Only on responses β†’ RK renewal
βœ… Combined: Both work together
βœ… Efficiency: Symmetric for speed, DH for freshness
βœ… Maximum security: Forward secrecy + post-compromise recovery
βœ… Timing: DH on first response per conversation segment


πŸŽ‰ Congratulations!​

You've completed the Double Ratchet section!

Next: Practical implementation.