
Tor隠れサービスを介したエンドツーエンド暗号化、設定可能な暗号、グループ通話のためのリレーモード、および反フォレンジックデータ破壊を備えた暗号化プッシュトゥトーク音声およびテキスト通信。
Tor隠しサービス上の暗号化プッシュ・トゥ・トーク音声通信。
TerminalPhoneは、単一の自己完結型Bashスクリプトで、Torネットワーク上で2者以上の間での匿名・エンドツーエンド暗号化音声およびテキスト通信を提供します。これはトランシーバーのように動作します:音声メッセージを録音すると、圧縮・暗号化され、単一のユニットとして相手に送信されます。通話中に暗号化されたテキストメッセージを送信することもできます。サーバーインフラストラクチャ、アカウント、電話番号は不要です。あなたのTor隠しサービス .onion アドレスがあなたのアイデンティティです。
T を押してメッセージを入力。.onion アドレスを交換。通話ヘッダーに相手のアドレスが表示されます。S を押すと設定にアクセス。暗号をその場で変更可能。相手側の表示も自動的に更新されます。jq が必要(必要に応じてインストール)。各トリガー後に音量は自動的に復元されます。.onion アドレスは永続的なルーティング可能なエンドポイントとして機能します。ポートフォワーディングやパブリックIPは不要。.onion アドレスを表示。qrencode がインストールされていない場合、インストールを促されます。QRコードは代替画面バッファにレンダリングされ、閉じると破棄されます。一部のQRスキャナーが http:// を自動付加する可能性があるとの注意書きがあり、発信時にこのプレフィックスは自動的に除去されます。.tmp 拡張子とランダムな16進識別子を使用。ファイルタイプやタイミングのメタデータはファイルシステムに漏洩しません。ExcludeNodes と StrictNodes を使用。/dev/urandom からのランダムデータで上書き。ファイルサイズを読み取り、そのバイト数のランダムデータを dd(conv=notrunc 使用)でファイルに書き込み、sync でストレージデバイスにフラッシュし、rm でファイルを削除。対象はすべての機密ランタイムファイル:生PCM録音、Opusエンコード音声、暗号化ペイロード、復号された着信音声とチャット、ボイスエフェクト中間ファイル、暗号・HMAC鍵素材、ノンスログ、セッションフラグ、PIDファイル、名前付きパイプ、ローテーション時のTor隠しサービス鍵、リレーセッションデータ。ディレクトリの場合、内部のすべてのファイルが再帰的に上書きされます。内蔵テストオプションでサンプルファイルを作成し、元の内容を平文と16進で表示、上書き後、上書きされた16進を表示してユーザーがデータが破壊されたことを視覚的に確認可能。デフォルトはオフ — ほとんどのユーザーには標準の rm で十分です。TerminalPhoneの一時ファイルは小さく短期間であり、通常のシステム活動によってディスク領域はすぐに再利用されます。この機能は、フォレンジックリカバリに対する追加の保護層を望むユーザー向けです。注意:SSDやフラッシュストレージでは、ウェアレベリングにより上書きが異なる物理NANDセルに書き込まれる可能性があります — フラッシュメディアでの唯一の信頼できる防御はフルディスク暗号化です。従来のHDDでは、上書きは同じ物理位置のデータを置き換え、ソフトウェアベースのすべてのリカバリに対して効果的です。RELAY:1 ハンドシェイクでリレーモードを自動検出し、ライブのグループ参加者数を表示。1人の発信者が退出しても他の接続は切断されません。オペレーターダッシュボードには参加者数、稼働時間、データスループットが表示されます。サポートされているディストリビューション: Debian/Ubuntu (apt)、Fedora/RHEL (dnf)、Arch (pacman)。``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git cd terminalphone bash terminalphone.sh
メニューからオプション **7** を選択すると、すべての依存関係が自動的にインストールされます。以下のパッケージがインストールされます:
| パッケージ | 用途 |
|---|---|
| `tor` | Onion ルーティングと隠しサービス |
| `opus-tools` | 音声圧縮(Opus コーデック) |
| `sox` | 音声処理ユーティリティ |
| `socat` | Tor SOCKS プロキシを経由した双方向 TCP リレー |
| `openssl` | AES-256-CBC 暗号化と復号化 |
| `alsa-utils` | 音声録音と再生(`arecord`、`aplay`) |
### macOS``` bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
選択肢 7 を選択すると、すべての依存関係が自動的にインストールされます。Homebrew がインストールされていない場合、スクリプトが先にインストールし、その後以下のパッケージをインストールします:
注意: macOS では、ALSA の代わりに sox を録音(rec)と再生(play)の両方に使用します。追加のオーディオパッケージは不要です。
Apple Silicon(M1/M2/M3+): お使いのターミナルがたまたま Rosetta 2 下で(x86_64 プロセスとして)実行されており、Homebrew がネイティブの ARM プレフィックス(/opt/homebrew)にインストールされている場合、brew install は通常 Cannot install under Rosetta 2 in ARM default prefix で失敗します。依存関係インストーラはこれを検出し、自動的に arch -arm64 で Homebrew を再実行します。そのため、スクリプトの起動方法に関係なく、選択肢 7 は機能します。
TerminalPhone は Termux を介して Android デバイスをサポートしています。Android のサンドボックス化されたオーディオアーキテクチャのため、追加で 2 つのコンポーネントが必要です。
ステップ 1: Termux のインストール
F-Droid から Termux をインストールしてください。Play ストア版は古く、更新が停止しているため使用しないでください。
ステップ 2: Termux:API アプリのインストール
F-Droid から Termux:API をインストールしてください。これは Termux パッケージではなく、別の Android アプリケーションであり、Termux と Android システム API の間のブリッジを提供します。TerminalPhone は、デバイスのマイクやメディア再生にアクセスするためにこれが必要です。
端末に Termux:API アプリがインストールされていないと、termux-microphone-record コマンドや termux-media-player コマンドが機能せず、オーディオの録音と再生が無音で失敗します。
Termux:API アプリをインストールした後、プロンプトが表示されたらマイクのパーミッションを付与してください。
ステップ 3: Termux 内で Termux:API パッケージをインストールする```bash pkg install termux-api
これは、Termux:APIアプリと通信するコマンドラインユーティリティをインストールします。
**ステップ4: TerminalPhoneを実行**```bash
git clone https://gitlab.com/here_forawhile/terminalphone.git
cd terminalphone
bash terminalphone.sh
オプション 7 を選択して、残りの依存関係をすべてインストールします。インストーラはまず pkg upgrade を実行してパッケージリンクの問題を解決し、次に tor、opus-tools、sox、socat、openssl-tool、ffmpeg、termux-api をインストールします。
Termux固有の依存関係:
| Package | 目的 |
|---|---|
termux-api | Android のマイクとメディアプレーヤーへの CLI ブリッジ |
ffmpeg | Android の M4A 録音を Opus エンコード用の raw PCM に変換します |
To receive a call: Select option 1 (Listen for calls) To make a call: Select option 2 (Call an onion address)
両者は、通話を開始する前にTorが動作しており、同じ共有秘密鍵が設定されている必要があります。
---
## 使用方法
### メニューオプション```
1 Listen for calls Wait for an incoming connection
2 Call an onion address Connect to a remote .onion endpoint
3 Show my onion address Display your .onion address (with optional QR code)
4 Set shared secret Configure the pre-shared encryption key
5 Test audio (loopback) Record and play back audio locally
6 Show status Display Tor, secret, and connection status
7 Install dependencies Install all required packages
8 Start Tor Start the Tor process and hidden service
9 Stop Tor Stop the Tor process
10 Restart Tor Stop and restart Tor
11 Rotate onion address Generate a new .onion address (destroys the old one)
12 Settings Configure Opus quality, PTT chime, Snowflake, auto-listen, PTT key, voice changer, security, Tor settings
13 Relay mode Start a zero-knowledge group bridge for N callers
0 Quit Stop Tor and exit
Linux(プッシュトーク):
| キー | アクション |
|---|---|
| SPACE 長押し | 音声メッセージを録音。離すと自動で送信。 |
| T | 暗号化テキストメッセージを送信。 |
| S | 通話中に設定を開く(暗号の変更、品質調整)。 |
| Q | 通話を終了しメニューに戻る。 |
Termux(トグルモード):
Androidのソフトウェアキーボードは、押下時ではなく解放時にキーイベントを送信します。Termuxでは、TerminalPhoneがトグルモードを使用することで対応しています。
| キー | アクション |
|---|---|
| SPACE タップ | 録音を開始。再度タップで停止し送信。 |
| T | 暗号化テキストメッセージを送信。 |
| S | 通話中に設定を開く(暗号の変更、品質調整)。 |
| Q | 通話を終了しメニューに戻る。 |
bash terminalphone.sh install # Install dependencies bash terminalphone.sh test # Audio loopback test bash terminalphone.sh status # Show status bash terminalphone.sh listen # Listen for incoming calls bash terminalphone.sh call ADDRESS # Call a .onion address bash terminalphone.sh relay # Start relay mode (group bridge)
---
## 動作の仕組み
TerminalPhoneは、録音してから送信するモデルを使用しています。PTTを起動すると、マイクは解放するまで連続的に録音します。録音全体は、次のパイプラインで処理されます:```
SENDER RECEIVER
────── ────────
Microphone Speaker
│ ▲
▼ │
Raw PCM (8kHz, 16-bit, mono) Opus decode
│ ▲
▼ │
Opus encode (16kbps) AES-256-CBC decrypt
│ ▲
▼ │
AES-256-CBC encrypt Base64 decode
│ ▲
▼ │
Base64 encode ──▶ socat ──▶ Tor ──▶ socat ──▶ Receive
ワイヤプロトコルはTCP接続上の行ベースのテキストです:
Termuxでは、AndroidのネイティブM4A録音形式に対応するため、追加の変換ステップがあり、Opusエンコードの前にffmpegを使用して生のPCMに変換します。
暗号化: すべての音声は、送信前にユーザー設定可能な暗号(デフォルト:AES-256-CBC)で暗号化されます。256ビット(最強)から128ビット(十分)までのランク付けされた21のキュレーションされた暗号が利用可能です。鍵は、PBKDF2(10,000イテレーション)を使用して事前共有秘密から導出されます。暗号化はアプリケーション層で適用され、Torのトランスポート暗号化から独立しています。秘密はコマンドライン引数ではなく、ファイル記述子(-pass fd:3)を介してOpenSSLに渡されるため、プロセステーブルに露出することはありません。
暗号ネゴシエーション: 接続時と呼び出し中に暗号が変更されるたびに、両当事者が暗号名を交換します。暗号名は秘密ではありません(Kerckhoffsの原理)。ローカルとリモートの暗号が一致しない場合、両当事者は呼び出しヘッダーに赤いインジケーターを表示します。
トランスポート: すべてのデータはTor隠しサービス回路を介してルーティングされます。どちらの当事者のIPアドレスも公開されません。クリアネットトラフィックはありません。ネットワーク観測者は接続をどちらかの当事者に帰属させることができません。
トラフィック分析耐性: 録音してから送信するモデルは不規則な送信パターン(可変長メッセージを不規則な間隔で)を生成するため、連続ストリーミングよりも指紋採取が困難です。
認証: 共有秘密は暗黙の認証として機能します。両当事者が同じ秘密を持っていない場合、復号は失敗し、音声は再生されません。接続時に、両当事者は発信者識別のために.onionアドレスを交換します。秘密はオプションでパスフレーズで保存時に暗号化できます。起動時にスクリプトはパスフレーズを求めてプロンプトを表示し、ロックを解除します。
HMACプロトコル署名(オプション): 有効にすると、HANGUP、PTT_START、PINGなどの制御信号を含むすべてのワイヤプロトコルメッセージが、共有秘密から導出されたHMAC-SHA256で署名されます。メッセージごとにランダムなnonceが含まれ、同一のコマンドが一意の署名を生成するようになっています。呼び出しごとに既知のnonceが追跡され、重複は拒否されるため、リプレイ攻撃を防ぎます。HMAC設定はランタイムファイルを介して呼び出し開始時に固定され、呼び出し中に設定が切り替えられても(変更は次の呼び出しで有効になります)、送信パスと受信パスが常に一致するようになります。受信側では、署名が無効、欠落、またはリプレイされたメッセージは黙ってドロップされます。これにより、Tor回路を侵害した(が共有秘密を持たない)攻撃者がコマンドを注入またはリプレイすることが防止されます。両当事者がHMACを有効にする必要があります。バージョン1.1.3より前とは互換性がありません。
制限事項:
リレーモードのセキュリティ: リレーはアーキテクチャ上ゼロ知識です。リレーは共有秘密を決して保持せず、いかなるコンテンツも復号できません。音声データはカーネルパイプバッファ(FIFO)を通過し、メモリ内にのみ存在します -- ディスクには何も書き込まれません。リレーが停止すると、すべての一時ファイルが削除されます。リレーオペレーターは、何が言われたか、発信者が誰か、メッセージを読むことができません。リレーはすべての制御信号(HANGUP、ID:、CIPHER:、PTT_START、PTT_STOP)をフィルタリングし、AUDIO:、MSG:、PINGのみを転送します。大域的受動的敵対者がトラフィック相関分析を実行して発信者をリレーに関連付ける可能性はありますが、メッセージの内容は不明なままです。
リレー容量: 主なボトルネックはTor帯域幅です。Tor隠しサービスのスループットは非常に変動しやすく、回路品質、リレー輻輳、地理的距離に依存します。典型的な10秒の音声メッセージは約20KB暗号化され、各送信はN-1人のリスナーにファンアウトします。
現実的な容量は、電話(Termux)で動作するリレーの場合は3~5人の発信者、安定した接続の専用Linuxマシンの場合は5~10人の発信者です。モバイルデバイスで動作するリレーは追加の制約に直面します:モバイルデータはTorに加えて遅延をもたらし、Androidはメモリを再利用するためにバックグラウンドのTermuxプロセスを強制終了する可能性があり、接続された発信者ごとにバッテリー消費が増加します。Tor回路の帯域幅はパス品質に応じて50KB/sから500KB/sまで変動し、回路はセッション中に劣化したりローテーションしたりする可能性があります。シングルホップモードはスループットを向上させますが、Torリレー輻輳を排除するわけではありません。これらの推定値は、同時に1人だけが送信するPTTモデルを前提としています。同時送信ではパフォーマンスがさらに低下します。グループ通話の発信者は、メッセージサイズを削減しリレーの負荷を軽減するために、Opusビットレートを下げる(設定 → Opusエンコード)ことを検討する必要があります。
すべての設定は、スクリプトの場所を基準とした.terminalphone/に保存されます。```
.terminalphone/
tor_data/ Tor data directory and hidden service keys
audio/ Temporary audio files (cleaned on exit)
pids/ Process ID tracking
shared_secret Encrypted shared secret file
torrc Generated Tor configuration
デフォルトのオーディオパラメータ(スクリプトの上部で定義されています):
| パラメータ | デフォルト | 説明 |
|---|---|---|
| `LISTEN_PORT` | 7777 | 受信接続用のTCPポート |
| `TOR_SOCKS_PORT` | 9050 | Tor SOCKSプロキシポート |
| `OPUS_BITRATE` | 16 | Opusエンコーディングのビットレート(kbps) |
| `CIPHER` | aes-256-cbc | 暗号化方式(設定で変更可能) |
| `SNOWFLAKE_ENABLED` | 0 | 検閲回避のためのSnowflakeブリッジ |
| `AUTO_LISTEN` | 0 | Tor起動時に自動で着信待機する |
| `PTT_KEY` | SPACE | プッシュトークキー(設定で変更可能) |
| `VOL_PTT` | 0 | 音量ダウンダブルタップでPTT(Termuxのみ、実験的) |
| `EXCLUDE_NODES` | (空) | Tor ExcludeNodesの国別リスト(例:`{US},{GB}`) |
| `HMAC_AUTH` | 0 | すべてのプロトコルメッセージにHMAC署名(オプション、両側で一致させる必要あり) |
| `OVERWRITE_DELETE` | 0 | 削除前に一時ファイルをランダムデータで上書き(デフォルトではオフ) |
| `PTT_CHIME` | off | PTT通知チャイムのプリセット(off, tone, double, chirp, ding, click, custom) |
| `SINGLE_HOP` | 0 | 低レイテンシのためのシングルホップTorモード(サーバーの匿名性を無効化) |
| `SAMPLE_RATE` | 8000 | オーディオサンプルレート(Hz) |
| `CHUNK_DURATION` | 1 | オーディオテストチャンクの長さ(秒) |
---
## トラブルシューティング
**Torがブートストラップに失敗する:**
Torのログを確認:`.terminalphone/tor_data/tor.log`。よくある原因は、時計のずれ、ネットワーク制限によるTorのブロック、または別のTorインスタンスが同じSOCKSポートを使用していることです。
**Termuxで音声が出ない:**
F-DroidからTermux:APIアプリがインストールされていることを確認してください(`termux-api`パッケージだけでは不十分です)。Androidの設定でTermux:APIアプリにマイク権限を付与してください。オーディオループバックテスト(オプション5)を実行して確認してください。
**Termuxでのffmpegインストールに失敗する:**
依存関係をインストールする前に`pkg upgrade`を実行してください。インストーラーは自動でこれを行いますが、手動でパッケージをインストールした場合、古い共有ライブラリがリンクエラーを引き起こす可能性があります。
**オーディオテストは成功するが、通話中は無音:**
両方の相手が同じ共有シークレットを使用していることを確認してください。シークレットが一致しないと、エラーメッセージなしで復号化に失敗します。通話は接続されますが、音声は聞こえません。
**Snowflakeブリッジの接続が遅い:**
SnowflakeはWebRTCプロキシ経由でトラフィックをルーティングするため、追加のブートストラップ時間がかかります。Snowflakeが有効な場合、Torが100%に達するまでに30~60秒(またはそれ以上)かかることが正常です。スクリプトはブートストラップ中に忍耐を促すメッセージを表示します。
**最初のTorブートストラップが遅い:**
初回起動時、Torはネットワークコンセンサス全体をゼロからダウンロードする必要があり、これには1~2分かかることがあります。スクリプトはこれを検出し、注意メッセージを表示します。ブートストラップのタイムアウトは初回実行時に120秒から300秒に自動的に延長されます。以降の起動ではキャッシュされたコンセンサスデータを使用するため、はるかに高速です。
**切断してもメニューに戻らない:**
Qキーを押した後にスクリプトがハングする場合は、Ctrl+Cを押して強制的にクリーンアップし、シェルに戻ってください。
**macOSで「Cannot install under Rosetta 2 in ARM default prefix」エラー:**
これはApple Siliconで、ターミナルがRosetta 2(x86_64プロセス)で実行されているが、HomebrewがネイティブのARMプレフィックス(`/opt/homebrew`)に存在する場合に発生します。依存関係インストーラー(オプション**7**)はこれを検出し、自動的に`arch -arm64`で`brew`を再実行します。手動でパッケージをインストールする場合は、自分で`arch -arm64 brew install <pkg>`とプレフィックスを付けてください。または、スクリプトを`arch -arm64 bash terminalphone.sh`でネイティブに起動してください。
---
[ミラー V1.0.0](https://bin.disroot.org/?e1356291b098cb75#FMQ4gxFwgdr3rjR1dpGS2csLmDPzDEkQW16fQ5P2Vt4y)
[ミラー V1.0.1](https://bin.disroot.org/?d3bc0b8976113f58#AuUm4ev4vfeVmPyrh2KjAdhDP6WN4UX6yKQh9ERGD5Qt)
[ミラー V1.0.2](https://bin.disroot.org/?6bc5b2fd046de1d7#G7TmnytrMeaM5AZYWth6BjjdqUb9RDf3K9erHUExKcGX)
[ミラー V1.0.3](https://bin.disroot.org/?c5010f039e4693fd#Brp1w7LRQH9d5Ye5npZDPxNVR855SW9QUAk9cJaUuLYX)
[ミラー V1.0.4](https://bin.disroot.org/?1831f6b78e349142#7zaAMVPNJL3MfbGJzjtm6cCPcvQftf4ULXupdne5dRKw)
[ミラー V1.0.5](https://bin.disroot.org/?edfcfc844987ed03#56LuBbqbkfNDXfHpydyaB3VcWYhYenX18dtSvNumERY9)
[ミラー V1.0.6](https://bin.disroot.org/?6c7b4774108b0c1c#GQPst46zjAYidndmNvytforX7MK2LyHanL4d829vVcv4)
[ミラー V1.0.7](https://bin.disroot.org/?047003637623b4fa#EwmaysciDpiDkht8xV7ce3QcR9oxFXaxSikh4cLheXBB)
[ミラー V1.0.8](https://bin.disroot.org/?06e38bd64e6fbdad#88MYs3dmq9rSMkmocpW3NYaaG4YfSdRCc9LJnEEzqGYp)
[ミラー V1.0.9](https://bin.disroot.org/?950218a9a7c71c66#E7Z94VCGBZozrfXYhGwKyAdMeTxuavg92tA1pn2DbrrB)
[ミラー V1.1.0](https://bin.disroot.org/?0b0da14f31521b3a#B1c23J8xFoZZKErvGG28PgbtfgtMUcDABWmQEoSZfXgh)
[ミラー V1.1.1](https://bin.disroot.org/?d8e2d4f0300eb5af#9Y1C8CkcH9jAmv1fh4GZs1yYpJmWCG5xG3SvDYdwnJam)
[ミラー V1.1.2](https://bin.disroot.org/?b1059616f880925f#8ef2oscZXUkPAsJZwGfWvLPQagVAk5GgW4DyssmLvQpG)
[ミラー V1.1.3](https://bin.disroot.org/?b02658801518aaa7#JE6CsBLWUwAnTdBqeHgeXL7QF5UExgi9rnygcfyMZjCJ)
[ミラー V1.1.4](https://bin.disroot.org/?d31248fc44c287a0#HQELFWFEMpM9kfTZSGDXTdGFMVKTejox5CajF9Vm4Www)
[ミラー V1.1.5](https://bin.disroot.org/?284b723ed6aad15f#8VCrrri6yRpdg3uVDSY94wpx7LYkw5uYhm4Vbhka83sM)
[ミラー V1.1.5.1](https://bin.disroot.org/?26aaef1eff20c271#4GxQQPSDhrszTu1RmERySNVqD2fZW5GZwm3JeL1parpB)
[ミラー V1.1.6](https://bin.disroot.org/?ae8270578cd9e081#BbcDLU49XqhecvwviHRcdfrZ4vhKdL2AMeKaT5v9oLV1)
[ミラー V1.1.7](https://bin.disroot.org/?457e4308abe582d8#B9LJG88rmUwrGHHuCof8WpE8CXGmkc2tyrXXicEiJFWk)
---
## ライセンス
MIT
| パッケージ | 目的 |
|---|
tor | オニオンルーティングと隠しサービス |
opus-tools | 音声圧縮(Opus コーデック) |
sox | オーディオ録音と再生(rec、play) |
socat | Tor SOCKS プロキシを介した双方向 TCP リレー |
openssl | AES-256-CBC 暗号化と復号化 |
| Vol Down ×2 | 音量ボタンで録音をトグル(設定で「Volume PTT」が有効の場合)。 |
| メッセージ | 説明 |
|---|
ID:<onion> | 発信者ID -- 送信者の.onionアドレス |
CIPHER:<name> | 送信者の暗号化方式。接続時および変更時に交換されます。 |
PTT_START | 送信者が録音を開始しました |
PTT_STOP | 送信者が録音を終了しました。音声が続くか、送信されました |
AUDIO:<base64> | 完全な暗号化音声メッセージ |
MSG:<base64> | 暗号化テキストメッセージ |
HANGUP | 送信者が切断しています |
PING | キープアライブ信号 |
RELAY:1 | リレー挨拶 -- 接続時にリレーから送信され、グループモードをトリガーします |
GROUP:<n> | グループサイズ更新 -- 発信者が参加または退出したときにリレーがブロードキャストします |
| 発信者数 | メッセージあたりのアウトバウンド | 期待される体験 |
|---|
| 2~3人 | 20~40KB | ほとんどの接続で信頼性あり |
| 3~5人 | 40~80KB | 安定した回路で良好、モバイルデータでは遅延の可能性あり |
| 5~10人 | 80~180KB | 限界に近い、送信間で顕著な遅延 |
| 10人以上 | 180KB以上 | 不安定、著しいキューイングとメッセージ損失の可能性 |