NIP-104: Double Ratchet DMs
NIP-104は、double ratchet designを使うend-to-end encrypted direct messagesのdraftです。Nostrの会話にforward secrecyとpost-compromise recoveryを持ち込むことを狙っています。
なぜ重要か
既存のNostr DM solutionには制限があります。
- NIP-04: contentは暗号化するがmetadataが漏れる
- NIP-17 + NIP-59: gift wrappingでmetadata leakageは防ぐが、forward/backward secrecyはない
NIP-104が狙うのは、その欠けている性質です。device stateやlong-term keyが侵害されても、攻撃者が会話履歴全体や将来のメッセージへ自動的に恒久アクセスできないようにします。
仕組み
NIP-104は、identity keyとprekeyを組み合わせるX3DH-style setupから始まり、そこで初期shared secretを導出します。その後は、各側がdouble ratchetを進めます。Diffie-Hellman ratchetは新しいpublic keyの交換に合わせてroot keyとchain keyを更新し、symmetric ratchetは送信chainまたは受信chainの内部でmessageごとのkeyを導出します。
各message keyは短命なので、後からstateが露出しても過去のciphertextを復元しにくくなります。そこがsingle static key方式との技術的な違いです。
Event Kinds
- Kind 10443: X3DH初期化のためのuser prekeyを公開する
- Kind 443: 暗号化された最初のmessageを含む初期会話セットアップ
- Kind 444: 確立済み会話での後続の暗号化message
暗号化messageはすべて、metadata保護のためkind 1059 GiftWrap eventに包まれます。
Security and Tradeoffs
security上の利得は、stateの増加と引き換えです。device pairingごとにratchet state、prekey management、out-of-order deliveryの回復ロジックが必要になります。古いbackupを復元したり、同期していない複数deviceを使ったりすると、会話を再確立するまで復号に失敗することがあります。
このtradeoffのため、double-ratchet messagingは普通のencrypted noteより後付けしにくいのです。clientに必要なのは単なるencryption primitiveではなく、永続的なlocal stateと慎重なdevice semanticsです。
相互運用メモ
このproposalは、専用のsetup kindとmessage kindに加え、transport privacyのためGift Wrapを使います。また、これらのgift-wrapped eventは、ユーザーのkind 10050 DM-relay preference eventに載っているrelayにだけ公開することを推奨しています。つまり、NIP-104はPrivate Direct Messagesの単純な置き換えではありません。clientはprekey flow、DM-relay discovery、ratchet state machineを明示的にサポートする必要があります。
主要ソース:
言及箇所:
関連項目: