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を明示的にサポートする必要があります。


主要ソース:

言及箇所:

関連項目: