あなたのアプリ
あなたの鍵を保管し、送るものすべてを暗号化し、受け取るものを復号します。メッセージ履歴はここにあり、ほかのどこにもありません。
知っていること: あなたが送受信するすべて。それはあなたのものです。
しくみ
アーキテクチャとプロトコルをわかりやすく紹介します。各章はまず考え方から始まります。技術的な詳細は「技術的な詳細」を開いてください。
章 1
Crocodile は役割を分担しています。あなたの言葉を見られるのは話している相手だけで、知らない人が運用する部分には決して見えません。
あなたの鍵を保管し、送るものすべてを暗号化し、受け取るものを復号します。メッセージ履歴はここにあり、ほかのどこにもありません。
知っていること: あなたが送受信するすべて。それはあなたのものです。
ボイスルームやスペースごとに、あるメンバーのアプリが選ばれ、暗号化された通信をほかのメンバーに中継します。ほかの人と同じ、ひとりのメンバーです。
知っていること: メンバーの IP アドレスと誰が話しているか。何を話しているかは決して知りません。
ボランティアが運用する電話交換台です。プロフィールとスペースを保存し、誰がオンラインかを伝え、ホストを選びます。ひとつのネットワークにつながっています。
知っていること: プロフィール、メンバーシップ、誰がオンラインか。何を話しているかは決して知りません。
調整サーバーの電話帳で、新しいアプリがどこから始めればよいかわかるようにします。人については何も知りません。
知っていること: サーバーの一覧だけ。
章 2
Crocodile をインストールすると、アプリがパソコン上で32バイトのランダムな秘密を生成します。そこから2つの鍵が生まれます。ひとつは公開するものに署名するため、もうひとつは暗号化されたメッセージを受け取るためのものです。ユーザー ID は署名鍵のフィンガープリントです。
ID は鍵から計算されるので、サーバーが別の鍵にすり替えてあなたになりすますことはできません。盗まれるパスワードも、サポート担当者をだまして行わせるリセットもありません。秘密はリカバリーキーとして一度だけ表示され、システムのキーチェーンで暗号化されてデバイス上に保管されます。
K7QF-M2XA-…-9PD4Ed25519X25519 + ML-KEM-768hash(🔑) → 4gq7…xk2m章 3
アプリはディレクトリから調整サーバーの一覧をダウンロードし、それぞれの応答速度を測って、最も速いサーバーに接続します。2番目は待機していて、サーバーが落ちるとアプリはすぐに切り替えます。
まず最初に、サーバーが自分の身元を証明し、アプリとサーバーがその接続用の鍵を取り決めます。以降は、やり取りするメタデータでさえ HTTPS の上でさらに暗号化されるため、自宅のサーバーでも安全に運用できます。
章 4
あなたのプロフィール、作成したスペース、その招待、メンバーの一覧は、書いた人が署名した小さなレコードです。サーバーはそれらを保存して共有し、すべてのサーバーとすべてのアプリが署名を検証します。サーバーはレコードの中継を拒否することはできても、改ざんしたり捏造したりすることはできません。
調整サーバーは互いを見つけてネットワークを形成します。各レコードはハッシュで選ばれた複数のサーバーに保持され、それらが変更を互いにコピーするので、どのサーバーが落ちてもネットワークは動き続けます。
profile:4gq7…xk2m章 5
人がボイスルームに参加したりスペースを開いたりすると、調整サーバーは全員の接続状況(ネットワークの開放度、アップロード速度、パソコン、バッテリー駆動かどうか)を見て、最適なメンバーをホストに選びます。次点がバックアップです。
全員がホストのアプリに接続し、ホストが暗号化された音声を中継します。負荷を軽くするため、各リスナーには声の大きい数人の話者だけを送ります。音声は途中で平文になることはなく、ホストは封をされたパケットを運ぶだけです。
ホストが抜けたり到達できなくなったりすると、バックアップが引き継ぎ、全員がそちらに再接続します。たいていは誰も気づきません。
全員がホストに接続します。ホストが退出:バックアップが引き継ぎます。
章 6
すべてはデバイスを出る前に暗号化され、鍵を持っているのは会話に参加している人だけです。メッセージが届くまでに何が起きるかを見てみましょう。
アプリはメッセージに署名して、あなたから来たことを他の人が証明できるようにし、長さから何もわからないようパディングし、会話のメンバーだけが持つ鍵で暗号化し、それ自体も暗号化された接続で送ります。途中に誰がいても、見えるのは標準サイズの意味のないバイト列だけです。
鍵は、実績のある従来方式 X25519 と、新しいポスト量子標準 ML-KEM-768 のハイブリッドで交換されます。攻撃者は両方を破らなければなりません。今日暗号化された通信を記録しておき、量子コンピューターで解読できる日を待つ、ということもありうるので、これは重要です。
削除済みこのメッセージ次の鍵
各メンバーの鍵はラチェットのように回ります。メッセージを送るたびに、前にしか進まないチェーンの次の鍵に置き換えられ、古い鍵は削除されます。今日鍵を盗んだ人でも、昨日のメッセージは読めません。30分ごと、そして誰かが抜けるたびに、全員が新しいランダムな鍵で新しいチェーンを始めるので、盗まれた鍵もすぐに役に立たなくなります。
あなたの声は1秒あたり約50の小さなフレームに分けられ、マイクの直後、ネットワークに届く前に暗号化されます。暗号化できなかったフレームは破棄され、平文で送られることはありません。音声は固定ビットレートを使うので、パケットのサイズから話の内容がわかることはありません。
章 7
オフィスや大学の厳しいファイアウォールなど、一部のネットワークはパソコン同士の直接接続をブロックします。そうなったとき Crocodile はそれを知らせ、調整サーバーに通信を中継させることを許可できます。
リレーは、すでにエンドツーエンド暗号化されたパケットを転送します。見えるのはサイズとタイミングだけで、中身は見えません。許可は1回につき1時間で、まだ必要な場合にだけ更新されます。
章 8
どのサーバーも履歴を保持しないので、Crocodile のアプリ同士がメッセージを受け渡します。オフラインの人にメッセージを送ると、こうなります。
メッセージはアプリの送信トレイに入り、小さな時計が表示されます。
二人ともオンラインになった瞬間、アプリが相手のデバイス向けに封をしたメッセージを届けます。
相手のアプリが受信を確認し、時計が消えます。スペースでは、メッセージを見逃したメンバーがホストとバックアップから取り込みます。
希望すれば、サーバーがダイレクトメッセージを最大7日間、デバイスごとに封をした状態で(サーバー自身には読めません)保管し、配信後に削除します。
章 9
新しいパソコンに短いコードが表示されます。それをサインイン済みのパソコンに入力し、両方の画面に同じ6桁のセキュリティコードが表示されることを確認します。一致すれば、アカウントが暗号化されて転送され、新しいデバイスの準備が整います。
セキュリティコードは両方のデバイスの鍵をカバーしているので、途中で誰かがどちらかをすり替えようとすれば、コードが一致せず気づくことができます。
コードが一致:安全にリンクできます
セキュリティ関連の記事でよく見かける用語を、それぞれ1〜2文で。