読めるのは、あなたと宛先の人たちだけ

Cryptico は、ウェブ・Android・iPhone で使える匿名のメッセンジャーです。電話番号もメールアドレスも本名もありません。すべてのメッセージはエンドツーエンドで暗号化され、たとえ私たちが望んでも、サーバーのコードにはそれを復号する手段がありません。

登録も電話番号も不要。ブラウザーでそのまま開きます。

横幅の広いブラウザーウィンドウで表示したウェブ版。左にチャット一覧、右に開いているグループの会話。

アカウントは人ではなく、言葉の並び

登録に差し出すものは何もありません。Cryptico がランダムなアイデンティティと 12 語の復元フレーズを生成し、そのフレーズ自体がアカウントになります。すべての鍵はそこから導出されます。認証する番号も、確認するアドレスも、あなたに結びつくプロフィールもありません。ユーザー名は任意です。見つけてもらいたいなら付ければよいし、そうでなければ付けなくてかまいません。

01

私たちが本当に言い切れる 4 つのこと

  • 01

    サーバーはメッセージを読めません

    これはポリシーではなく、ビルドの性質です。サーバーのバイナリにはメッセージ本文の定義がそもそもコンパイルされていないため、復号にたどり着くコード経路が存在しません。この前提が崩れた時点でビルドが失敗するチェックを、パイプラインに組み込んでいます。

    check-proto-content-boundary.mjs
  • 02

    現実世界の識別子は一切使いません

    電話番号もメールアドレスも本名も、アプリにもデータベースにもプロトコルにもありません。追加しようとする変更は自動チェックがはじきます。連絡先カードの下書きに電話番号の項目が紛れ込んだことが一度ありましたが、削除したうえで、その枠自体を永久に封じました。

    check-forbidden-columns.mjs
  • 03

    Signal Protocol と、耐量子の鍵合意

    ハンドシェイクは PQXDH、メッセージは Double Ratchet、グループは Sender Keys。すべてのセッションで、従来方式に加えて耐量子の Kyber-1024 交換を必ず行います。オプションではなく、毎回のハンドシェイクで行うので、いま記録された通信が将来の量子コンピューターで読めるようになることはありません。ハンドシェイク以降は従来型の暗号なので、私たちは「全体が耐量子」ではなく「耐量子の鍵合意」と表現しています。

    libsignal · PQXDH · Kyber-1024
  • 04

    自社サーバーでも聞けない通話

    1 対 1 の通話は端末どうしを直接つなぎ、メディアにはどのサーバーも触れません。グループ通話は自社のメディアサーバーを経由しますが、各フレームはそこへ届く前に暗号化され、その鍵がサーバーに渡ることはありません。通話メディアの鍵がサーバーのコードに入り込まないよう、ビルド時のチェックで完全に排除しています。

    check-call-media-key-boundary.mjs
02

実際にできること

デモではなく、メッセンジャーです。ここに並ぶものはすべて製品に入っており、意味のあるすべてのプラットフォームで動きます。

  • チャットらしく動くチャット

    メンション、返信、編集、全員から削除、リアクション、転送、複数選択、自分用のブックマークに対応。送信・既読の通知、入力中の表示、下書き、1 つのチャット内の検索と全体検索も。文字だけでは足りないときのために、投票、チェックリスト、地図の地点、連絡先カードもあります。

  • 最大 128 人のグループ

    グループを作り、メンバーを追加・削除し、有効期限と使用回数の上限を付けたリンクで招待し、特定の相手や全員をメンションできます。サーバーはメッセージを配るだけで、グループの名前も説明も、誰にちなんだ名前かも知りません。

  • ファイル・写真・ボイス

    1 件あたり最大 100 MiB の添付が 8 種類——写真、動画、ボイスメッセージ、ビデオメッセージ、ファイル、GIF、ステッカー、オーディオ——アルバムと閲覧注意の目隠しにも対応。すべてのファイルは端末上で使い捨ての鍵により暗号化され、開く前に改ざんの有無を検証します。

  • メッセンジャー内のミニアプリ

    カタログ、ワンタップのインストール、サンドボックス実行環境に加えて、開発者コンソールと匿名の通報ボタンを用意。チェックサムがマニフェストと一致しないアプリは、そもそも起動しません。

  • 本当に遮断するブロック

    個人チャットでは、ブロックした相手のメッセージが届くことはなく、相手も届かなかったことに気づきません。ブロックは 180 日続き、送信を試みるたびに期限が延びます。

  • 1 つのアカウントで最大 10 台

    フレーズで新しい端末を連携し、一覧を確認し、どれでも連携を解除できます。使えるセッションが 1 つも残っていない状態でも解除できます。連絡先、フォルダー、チャット一覧、ブロック、設定は暗号化されたまま引き継がれます。メッセージの履歴は大部分が引き継がれません。これは「約束しないこと」に書いてあります。

03

1 対 1 でも、グループでも通話

音声とビデオ、フロント・リアカメラの切り替え、同時に最大 8 つのビデオタイル、挙手、画面共有、各タイルのマイクとカメラの表示。メディアは既定でリレー経由なので、相手にあなたのアドレスは見えません。

4 人が参加しているグループ通話。うち 1 人が手を挙げている。スマートフォンでのグループ通話。
04

フォルダー、ピン留め、静かなチャット

ルールで振り分けるフォルダー、ピン留め、ミュート、共有メディアの一覧、そして接続状態を正直に伝えるバナー。ミュート中のチャットでもメンションは届きます。これは意図的な仕様です。

フォルダーの編集画面と、どのチャットをそこに入れるかを決める振り分けルール。スマートフォンのチャット一覧と、新しいグループを作成する画面。
05

実際のしくみ

信じるより確かめたい人のための、短い説明です。

プライバシー設定。既読通知、PIN、自動ロックまでの時間。スマートフォンのプライバシー設定。生体認証によるロック解除、自動ロック、相手を確認するための安全番号。
ハンドシェイク
PQXDH。Curve25519 に Kyber-1024 のプリキーを組み合わせ、例外なくすべてのセッションで使うため、最初の 1 通目から鍵合意が耐量子になります。
メッセージ
Double Ratchet。メッセージを送るたびに鍵が先へ進むので、あとから鍵が漏れても、それ以前のやり取りは開けません。
グループ
Sender Keys、最大 128 人。メッセージを配る必要があるためサーバーはメンバー一覧を知っていますが、グループの名前は知りません。
グループ通話
フレームは自社のメディアサーバーへ届く前に暗号化されます。鍵は通話を始めた端末が生成し、メッセンジャー自身が配り、誰かが参加・退出するたびに更新されます。
ファイルと写真
AES-256-GCM。ファイルごとに新しい鍵を作り、暗号化されたエンベロープに入れて渡し、復号の前に SHA-256 で検証します。ストレージが持っているのは、解釈できないバイト列だけです。
端末の中では
ローカルのメッセージデータベースは保存時に暗号化されます。Android と iPhone は SQLCipher、ブラウザーは AES-256-GCM です。
復元フレーズ
12 語。アカウントのすべての鍵はここから導出されます。BIP39 のあと Argon2id を用い、1 回の推測ごとに 64 MiB と 3 パスを要求するため、総当たりは割に合いません。サーバーには、そこから逆算できるものは何も残りません。
相手を確認する
会話ごとに 60 桁の安全番号があり、通話中には 6 桁のコードが表示され、どちらかが読み上げて確かめます。通話コードはその接続だけから計算されるため、毎回異なります。
アプリロック
4 桁の PIN を Argon2id と AES-256-GCM で包み、試行は 5 回まで。端末が対応していれば生体認証も使え、放置すると自動でロックします。PIN が開けるのは端末で、アカウントを持つのはフレーズです。
設定と連絡先
復元フレーズから導いた鍵で暗号化したまま同期します。各レコードの名前でさえ、文字列ではなく鍵付きハッシュです。サーバーが保管しているのは項目ではなく、中身のわからない塊です。
ライブラリ
Android と iPhone は Signal 公式のライブラリを使います。Signal はブラウザー向けのビルドを一切公開していないため、ウェブ用のエンジンは Signal のソースからバージョンを固定して自前でコンパイルしています。ここでビルドを通すために変えたのは 1 行だけで、暗号の部分には手を触れていません。
06

約束しないこと

どのメッセンジャーのトップページも、何を守るかを語ります。このページは、守れないものも書きます。私たちに直せない部分こそ、あなたが最も知っておくべきところだからです。

  • 誰が誰と話しているかは見えます

    エンドツーエンド暗号化が隠すのは話した内容であって、話したという事実ではありません。メッセージを届けるために、サーバーは受け取る相手と時刻を知る必要があります。配信にはメンバー一覧が欠かせないため、グループの構成も保持しています。誰が誰と話しているか知らない、とは正直に言えません。言えるのは、内容には一切触れないこと、そしてサーバーのコードにはそれを解析する手段すらないことです。

  • プッシュ通知は Google と Apple にタイミングを渡します

    Android の通知は Firebase Cloud Messaging を、iPhone の通知は Apple のサービスを通ります。プッシュ自体に本文も送信者も含まれませんが、どの端末がいつ起こされたかは配信側に見えており、そのタイミングを突き合わせれば誰が誰と話しているかを組み立てられます。他社のサービスが起動の経路である以上、アカウントの匿名性は、やり取りが起きた事実とその時刻までは覆えません。

  • 履歴はほとんど付いてきません

    新しい端末でサインインすると、アイデンティティ、プロフィール、連絡先、フォルダー、チャット一覧、ブロック、設定の一部は戻りますが、メッセージの履歴は戻りません。やり取りしている相手が浅い範囲を送り直してくれるだけで、さかのぼれるのは 30 日までです。履歴のサーバー側バックアップは、設計として存在しません。

  • フレーズを失えば、誰も助けられません

    サポートがあなたを中に戻すことはできません。戻すための手がかりが私たちの側に何もないからです。番号も、アドレスも、パスワードのヒントもありません。12 語がアカウントのすべてです。それがこのページの残りすべての代償であり、登録したあとではなく前に知っておいてほしいと考えています。

  • ログは取ります。ただし、あなたの中身は入りません

    運用のためのサービスログは保持しますが、そこにメッセージ本文も、暗号文の中身も、鍵も、復元フレーズも含まれません。「ログを一切取らない」と言えば嘘になります。「ログに内容は含まれない」は本当で、私たちが約束するのはそちらです。

07

動作する場所

スマートフォンで開いているグループの会話。スマートフォンでのグループ通話。スマートフォンの招待画面。QR コードと、相手に渡す招待コードが表示されている。
08

実際によく聞かれること

料金はいくらですか?

無料です。有料プランも広告もアップセルもありません。制限は技術的なものだけで、たとえば 1 ファイル 100 MiB、保管は 30 日です。もし有料プランを設けることになれば、始めてからではなく、始める前にお知らせします。

コードは公開されていますか?

まだです。開発が落ち着いたら公開します。その日が来るまで、私たちは自らを open source とは呼びません。確かめようのない主張を、信じてくださいとお願いするつもりはないからです。リポジトリを公開したら、その場所をここに書きます。

復元フレーズをなくしたらどうなりますか?

そのアカウントは失われます。リセットのリンクはなく、サポートが中に戻す手段もありません。私たちが握る復元経路は、他人にとっての侵入経路にもなるからです。

誰から連絡が来ますか?

相手にはあなたのユーザー名か、あなたが渡した招待リンクか、QR コードが必要です。そもそも見つけられたくないなら、ユーザー名を付けないでください。誰でもブロックでき、ブロックした相手はあなたに届かなくなります。

相手が本人かどうか確認できますか?

はい、2 通りあります。会話ごとに 60 桁の安全番号があり、双方で一度照合できます。通話中は両方の画面に同じ 6 桁のコードが出るので、片方が読み上げ、もう片方が確認します。通話コードは通話のたびに新しくなります。

複数の端末で使えますか?

はい、最大 10 台まで。どの端末も復元フレーズで連携し、一覧からいつでも解除できます。連絡先、フォルダー、チャット一覧、設定は暗号化されたまま移りますが、メッセージの履歴は大部分が移りません。

利用者を分析したり、データを売ったりしますか?

広告もデータの販売もありません。このページには解析ツールも第三者のスクリプトも一切なく、他社のサーバーへ向かうリクエストは 1 つもありません。

準備ができたら知らせてください

入れる価値のあるものができた日に、1 通だけお送りします。ニュースレターも段階配信もなく、外部の配信サービスも使いません。アドレスは自社のデータベースにとどまり、どこへも渡りません。

確認メールは送らないため、打ち間違えると何も届きません。送信する前にアドレスをご確認ください。