要約
アカウントは鍵ペアです。電話番号もメールも必須の名前もなく、発見可能設定は既定でオフ。通信事業者に照会しても何も得られません。間に通信事業者はいないからです。
gRPC 双方向——iOS では QUIC 上で HTTP/2 フォールバック付き、Android では HTTP/2 上——ネットワークが変わってもハンドシェイクを張り直さない、1本の長寿命ストリーム。
ポスト量子は既にプロトコルの中に。セッション確立時に ML-KEM-1024 を受信者の Kyber プリキーへカプセル化し(PQXDH)、セッションの初期鍵に組み込みます。会話の1通目も保護され、ポスト量子の部分なしではセッション自体が確立されません。これが守るのはメッセージと添付ファイルの内容です。誰が送ったかもポスト量子で守られ、通話も双方のアプリがポスト量子 DTLS に対応していれば同様です。まだ古典的なもの:サーバーの署名(送信者証明書、鍵透明性ログ)、デバイスのサインイン、アカウント復旧。グループはまだありません——すべての層はプロトコル仕様に記載しています。
- * 送信者の匿名性(sealed sender)とは、誰が書いたかの印を付けずにメッセージを送ることです。それを開けるのは受信者だけで、サーバーには開けません。アプリでは常に有効で(セキュリティ設定の「ステルス」)、切り替えるものはありません。
- ** 不透明な識別子とは、あなたについて何も語らない文字列です。アカウント作成時に割り当てられた文字の並びにすぎません。
現時点でできること
現在の Konstruct(コンストラクト)は、主に使うメッセンジャーを補う二つ目の連絡手段として存在しています。機能は最小限で、1対1のチャットと通話だけです。グループもチャンネルも、端末間の同期もありません。
技術アーキテクチャ
ひとことで言うと、メッセージは端末上で暗号化され、サーバーは読めないまま暗号文を運びます。以下では、その層ごとの仕組みを説明します。
Konstruct の実装は Signal Protocol の設計(X3DH + Double Ratchet)を Rust でゼロから書き、ポスト量子鍵合意(ML-KEM-1024)で拡張したものです。
Konstruct は効率的なバイナリフレーミングのために Protocol Buffers を用いた gRPC を使い、リアルタイム配信のために永続的な双方向 MessageStream を開いたままにします——リクエスト/レスポンスのポーリングではありません。バックエンドは障害を隔離するために独立したサービス(identity、messaging、signaling、media)に分割されています。iOS の本番経路は QUIC 上の gRPC 双方向で、HTTP/2 が自動フォールバックです。Android は HTTP/2 を使います。
暗号スタック
- X3DH + Double Ratchet(Signal Protocol 設計): 前方秘匿性と post-compromise security(自己修復)を備えたエンドツーエンド暗号化。
- ポスト量子鍵合意(PQXDH): セッション確立時、イニシエータは受信者の Kyber プリキーに対して ML-KEM-1024(NIST FIPS 203)の秘密をカプセル化し、その秘密は X25519 の出力と一緒にセッションの初期鍵に入ります。そのため、記録されたセッションは X25519 を破るだけでは復元できません。ポスト量子の保護は最初の1通から有効で、古典的なセッション確立の経路はありません。さらに、すべてのセッションで ML-KEM-768 の疎なラチェットが動作し、確立時に一度きりではなく会話の進行に合わせて(16 回の送信方向の切り替わりごと、または 7 日ごとに)新しいポスト量子素材を混ぜ、そこからメッセージごとに固有のポスト量子鍵を導出します。
- 署名: ハイブリッド Ed25519 + ML-DSA-65(Dilithium-3、NIST FIPS 204)——すべてのポスト量子プリキーに付き、両方が検証されます。両方の署名がないプリキーをクライアントは受け入れません。ハイブリッド鍵自体は Ed25519 で署名され、最初の接続時に固定されます。デバイスのサインイン、アカウント復旧、サーバーが発行する送信者証明書は、現在も Ed25519 のみです。
- AEAD: メッセージ暗号化に ChaCha20-Poly1305。 KDF: プロトコル各セクションに ドメイン分離ラベル付き HKDF-SHA256。 スパム対策 PoW: Argon2id。
- サーバーは内容を見ない:メッセージは暗号文のみとして保存され、サーバーは復号できません。Privacy Pass トークンは 送信者を伏せた送信に添えることができます。サーバー側でのトークンの強制適用は展開中です。
- 暗号アジリティ: プロトコルはスイートのバージョンを運ぶため、メッセージ形式を変えずに新しいアルゴリズム構成を導入できます。直近の移行(PQXDH v2、ラチェットのスイート 4)は一斉切り替えでした。古いスイートのセッションは拒否され、次の送信で開き直されます。アルファの間は、長い互換期間よりこちらを選んでいます。
トランスポート層
- QUIC 上の gRPC 双方向 MessageStream — iOS の本番経路(construct-transport)。1本の長寿命ストリームがハートビート、受信メッセージ、レシートを運び、イベントごとの TCP ハンドシェイクを不要にし、ネットワークの切り替わりを乗り切り、QUIC が遮断されると自動的に HTTP/2 + TLS 1.3 上の gRPC へフォールバックします。E2EE はその上にあり、トランスポートは封緘済み暗号文のみを運びます。
- 検閲耐性: 直接の TLS 接続が遮断されると、クライアントは自動的に、ユーザーの操作なしに難読化レイヤー経由へ切り替えます。実装はオープンソースで、設計は公開されています。運用上の詳細——どのトランスポートが稼働中か、どの入口がどこに存在するか——は公開しません。アプリもこのサイトも表示しません。
サーバーから見えるもの
あらゆる中央集権的なプラットフォームは1つの前提から始まります——「あなた」とはそのデータベースの1行だ、と。電話番号、プロフィール、そのプラットフォームが所有し引き渡すこともできる連絡先グラフ。Konstruct はもっと少ないところから始めます。サーバーが保持するのはアカウント識別子、あなたの公開鍵、プッシュトークン。メッセージ自体については不透明な受信者 ID、配送時刻、サイズだけが見えます。送信者の匿名性は送信者 ID を取り除くため、誰が書いたかを明かせるのは受信者だけです。暗号文の配送に必要なのは、ちょうどそれだけです。
アドレス帳がないので、見知らぬ相手からのメッセージもありません。会話は QR コードか招待リンクから始まります——使い捨てで、有効期間は12時間です。ユーザー名による検索はありますが、任意で、有効にするまではオフです。
暗号化しても、あなたが観測されなくなるわけではありません。タイミングと IP の相関は回線上で見えたままで、十分なリソースを持つ敵対者はそちらの層で動きます。それでも、私たちのシステムのどの部品も、あなたのデータを蓄積するようには設計されていません。
テレメトリは一切なし。「匿名化」されたものも。
Konstruct は解析、利用状況の指標、行動イベント、クラッシュレポート、広告識別子のいずれも収集しません。サードパーティ SDK はありません——Firebase も Crashlytics も Sentry も——ATT の確認も SKAdNetwork もありません。リリースビルドはディスクにログを書きません。ひとつだけ私たちの管理外のものがあります。ベータが TestFlight で配布されている間、Apple は標準のテスト指標——インストール日、ビルドのバージョン、セッション数とクラッシュ数——を私たちに提供します。これは Apple のものであって私たちのものではなく、App Store でのリリースをもって終わります。配送のためにサーバーは小さな固定のメタデータ——宛先、時刻、サイズ、あなたの公開鍵、iOS ではプッシュトークン——を保持し、送信者の匿名性により、封筒から送信者も取り除かれます。それでも解決しない時刻と IP の相関については、プライバシーポリシーに記載しています。
主な機能
- 既定でエンドツーエンド暗号化 — サーバーは暗号化されたデータだけを見ます。
- 前方秘匿性 — 鍵が漏れても過去のメッセージは保護されたままです。
- 検閲対策 — 既定で有効。直接接続が機能する間はそれを使い、明確に止まったときだけ切り替えます。
- 禅 UI — 通知スパムなし、ソーシャルノイズなし、落ち着いたやり取りに集中。
- ポスト量子鍵合意 — セッション確立時に ML-KEM-1024(Kyber-1024)を受信者の Kyber プリキーへカプセル化し(PQXDH)、初期鍵に組み込みます。これなしではセッションは確立されません。その後もすべてのセッションが Double Ratchet の内部で ML-KEM-768 による鍵更新を続け、メッセージごとに固有のポスト量子鍵を持ちます。署名はハイブリッド Ed25519 + ML-DSA-65(Dilithium-3)——ポスト量子プリキーはすべて両方の署名を持ち、署名のないプリキーにはセッションを確立しません。
- 現代的なライブトランスポート — QUIC 上の gRPC 双方向 MessageStream(HTTP/2 フォールバック)、直接経路が遮断された場合の検閲耐性ルーティング、両者がオンラインのときの直接 P2P は計画中。
- オープンソース — クライアント、サーバー、トランスポートを弱いコピーレフトのライセンスで公開。自分のサーバーの運用はロードマップ上で、アプリはまだそれを指定できません。
設計方針
譲らない2つの立場:
1. 安全なバックドアは存在しません。暗号を意図的に弱めれば抜け穴ができ、そこを通るのは、その穴を想定していた相手ではありません。
2. 既定でプライベート。利用者が何もしなくても成り立つ必要があります——設定ではなく、プロトコルの性質です。
作らないもの。口実が何であれバックドアは作りません。エンゲージメント機構も作りません——無限スクロールも、連続記録も、通知の誘引もなし。データの再販もしません:売るものがなく、養う広告事業もありません。
仕様とソースコード
このページに書かれていることは、プロトコル仕様書(ホワイトペーパー)で詳しく説明されています。仕様書はコードと並べてバージョン管理され、リファレンス実装で検証できる内容だけを載せています。
- プロトコル仕様書(ホワイトペーパー)
- 脅威モデル — 何から守り、何からは守らないのか
- 暗号プリミティブ
- セッションハンドシェイク(X3DH + PQXDH)
- メッセージ暗号化(Double Ratchet)
- トランスポート層
- メタデータのプライバシーと送信者の秘匿
- 実装状況 — できていること、できていないこと
- GitHub のソースコード
注意:外部監査は受けていません。ここまでに書いたことは、すべて私たち自身が自分たちのコードを読んだ結果です。プロジェクトの外の誰かが検証したわけではありません。そうである限り、これらの性質は監査の結果ではなく、私たちが根拠を示す用意のある主張として受け取ってください。