- Tor ネットワーク経由で**音声とテキストを匿名・エンドツーエンド暗号化(E2EE)**でやり取りする、Bash ベースのウォーキートーキー型通信ツール
- サーバー、アカウント、電話番号不要で、
.onion アドレスだけで相手と直接接続し、音声メッセージを録音してから送信する**プッシュ・トゥ・トーク(PTT)**方式
- AES、ChaCha20、Camellia、ARIA など 21 種類の暗号の選択、HMAC-SHA256 認証、PBKDF2 鍵導出など強力なセキュリティ機能を提供
- Linux と Android Termux の両環境をサポートし、sox・opus-tools・Tor・openssl などの標準ツールだけで動作
- 単一スクリプトで構成されており、インストールと保守が簡単で、セキュリティ研究やプライバシー重視の通信実験に活用可能
概要
- TerminalPhone は Tor Hidden Service を利用して、2 人のユーザーが匿名で音声とテキストを交換できるようにする Bash スクリプト
- すべての通信は AES-256-CBC(デフォルト)などの選択可能な暗号で保護
.onion アドレスがユーザー識別子の役割を果たす
- サーバーインフラやアカウント登録は不要
主な機能
- ウォーキートーキー方式の音声メッセージ: 録音後に送信し、リアルタイムストリーミングはなし
- 通話中の暗号化チャット:
T キーでテキストメッセージを送受信
- 自動終了検知および相手の状態表示(録音中/待機中)
- 21 種類の暗号選択とリアルタイム交渉表示、通話中の暗号変更が可能
- Snowflake ブリッジ対応で検閲回避が可能
- QR コードでのアドレス共有、ボイスチェンジャー、PTT 通知音、**自動受信(auto-listen)**など多様な追加機能
- HMAC-SHA256 プロトコル認証によりリプレイ攻撃を防止
- Tor 回路経路の表示と特定国の除外設定をサポート
- 単一の Bash ファイル、root 権限不要、**低帯域幅(16kbps)**環境でも動作
インストール
- Linux:
git clone 後に bash terminalphone.sh を実行し、メニュー 7 で依存関係を自動インストール
- インストールパッケージ:
tor, opus-tools, sox, socat, openssl, alsa-utils
- Android Termux:
- F-Droid から Termux と Termux:API アプリをインストール
pkg install termux-api 後に bash terminalphone.sh を実行
- 追加パッケージ:
ffmpeg, openssl-tool, tor, sox, socat など
使い方
- 基本手順
bash terminalphone.sh を実行
- メニュー 7 で依存関係をインストール
- メニュー 8 で Tor を起動
- メニュー 4 で共有秘密鍵を設定
.onion アドレスを相手に伝える
- 受信: メニュー 1 の “Listen for calls”
- 発信: メニュー 2 の “Call an onion address”
- CLI モードのコマンド例:
bash terminalphone.sh call ADDRESS
bash terminalphone.sh listen
動作方式
- **録音してから送信(record-then-send)**モデル
- 録音した音声は Opus エンコード → AES 暗号化 → Base64 エンコード → Tor で送信
- 受信側は逆順で復号と再生を行う
- プロトコルメッセージはテキストベースで、
ID, CIPHER, PTT_START, AUDIO, MSG, HANGUP, PING などを含む
- Termux では
ffmpeg で M4A を PCM に変換してから処理
セキュリティ構造
- 暗号化: PBKDF2(10,000 回反復)で導出した鍵を使用し、Tor の転送暗号化とは別にアプリケーション層で追加保護を実施
- 暗号交渉: 接続時および変更時に相互交換し、不一致時はヘッダーに赤色表示
- 転送経路: Tor Hidden Service 回路を通じて IP を露出せずに通信
- トラフィック分析耐性: 不規則な送信パターンでフィンガープリント化を防止
- 認証: 共有秘密鍵が一致しないと復号に失敗
- HMAC-SHA256 署名: すべてのメッセージにランダムな nonce を含め、リプレイ攻撃を遮断
- 制限事項:
- 秘密鍵は外部の安全なチャネルで交換する必要がある
- 前方秘匿性はなく、鍵が漏えいすると過去の通信を復号できる可能性がある
- エンドポイントのセキュリティ侵害時は保護不可
ライセンス
1件のコメント
Hacker Newsのコメント
v3 onionアドレスを暗号学的IDとNATトラバーサル層の両方として使う構造が本当に洗練されている
STUN/TURNサーバーも、ホールパンチングも不要で、スクリプトを実行すればTorがルーティングを処理してくれる
Torで約20KBのOpusオーディオチャンクを送るとき、実際の遅延がどれくらいなのか気になる — 2〜3秒程度なのか、それとももっとひどいのか
ウォーキートーキー方式なら、ユーザーが「聞く→話す」の順序を守るので、遅延が大きな問題にならない
STUNではトラフィックは2台の機器間だけを流れるが、TorのようなVPNでは中間サーバーをすべて経由するため、トラフィックコストが大きい
VPSで月あたり数GBの制限がある場合には大きな制約になる
むしろテキストメッセージの方がよさそうだ。それでもプロジェクト自体はすばらしい
onionサービスをバックエンドとして活用した実例を見るのは興味深い
近いうちに、RustライブラリとしてTorをアプリに直接埋め込めるArti onionクライアントもサポートされる予定
こうした試みが増えるほど、ネットワークのカバートラフィックも増えるはず
そのため、企業ネットワークや公共Wi-Fiのような統制された環境では、Torの利用はほぼ不可能
リアルタイムでないなら、受信側で再生速度調整や無音区間の除去を入れて遅延を減らすこともできる
複数人が同時に送った音声を高速再生することも可能
Opusを使っているなら、実験的機能であるDREDエラー復元スキームをコーデックとして試してみる価値がある
転送中にTorが切れても、受信者が最低限の音声を受け取れるように、まずDREDデータを送る構成にもできる
「21種類の暗号アルゴリズムが提供されている」という部分が興味深い。多すぎる気もする
AES-GCMを使いたかったが、OpenSSL単体では認証処理が難しかった
Tor自体がすでにE2EEなので、この層は実質的に二重暗号化になっている。それでもネットワークに届く前にもう一度暗号化される点は気に入っている
GitLabが最近以前より速くなった気がするが、実際に最適化されたのか、それともlazy loadingによる錯覚なのか気になる
このプロジェクトは本当に気に入った。ユーザーが認証情報を安全に交換するにはどうすればいいのだろう? PGPメールはよい選択だろうか?
できれば直接会って交換するか、セキュアメッセンジャー経由で交換するのが理想
物理的な空間(黒板、掲示板、看板など)に残しておく方法もある
こうすれば完全にオフラインの状態でも将来の相手とつながれる
Tor回線で特定の国を**除外(Exclude Countries)**する機能は興味深い
Five Eyes、Nine Eyes、Fourteen Eyesのようなプリセットもあり、torrc設定でExcludeNodesとStrictNodesを使う
実際にセキュリティ向上に役立つのか気になる
侵害されたノードが存在するのは事実なので、効果の有無は別として、制御権があるのは興味深い
Torの遅延特性を考えると、ウォーキートーキーモデルは非常に賢い設計
リアルタイム双方向音声は往復150msを超えると不自然になるが、Torはホップごとに50〜200msを追加する
ストア・アンド・フォワード方式で設計すれば、ネットワーク特性と戦わずに済む
どのコーデックを使っているのか気になる — リアルタイムでないならOpusのトレードオフも変わり得る
6kbpsでも音声認識率がかなり高くて驚いた
Termuxではマイクにアクセスできないため、Termux APIアプリとffmpegを通して音声を変換する必要がある
数秒の遅延があるだけでも、不要な無駄話を減らせる
これをグループ通信のように、複数人が同じチャンネルに参加する形に設定できるのか気になる
面白そうだったのでコードをざっと見てみたが、
'|| true'が76回、'echo ""'が50回、' [ 'が261回、'=$('が90回出てくる'['が非推奨とされる理由はわかるが、'|| true'のようなパターンはなぜ問題なのか知りたい。私はset -euo pipefailと組み合わせてカスタムエラー処理によく使う