
terminalphone — Updated!
Tor 히든 서비스를 통한 암호화된 푸시투톡 음성 및 텍스트 통신, 종단간 암호화, 구성 가능한 암호화 방식, 그룹 통화를 위한 중계 모드, 그리고 포렌식 방지 데이터 파괴 기능.
TerminalPhone
Tor 히든 서비스를 통한 암호화된 푸시투토크 음성 통신.
TerminalPhone은 Tor 네트워크를 통해 둘 이상의 당사자 간에 익명의 종단 간 암호화 음성 및 텍스트 통신을 제공하는 단일 자체 포함 Bash 스크립트입니다. 워키토키 방식으로 작동합니다: 음성 메시지를 녹음하면 압축, 암호화되어 단일 단위로 원격 당사자에게 전송됩니다. 통화 중에는 암호화된 텍스트 메시지도 보낼 수 있습니다. 서버 인프라, 계정, 전화번호가 필요 없습니다. Tor 히든 서비스 .onion 주소가 곧 당신의 신원입니다.
목차
기능
- 전이중 음성 스트리밍 (WebSockets) -- WebSockets를 사용하여 Tor 히든 서비스를 통한 실시간 연속 양방향 오디오 스트리밍. 양측 모두 스페이스바를 누르지 않고 동시에 말하고 들을 수 있습니다. 설정(옵션 9)에서 구성 가능하며 통합 라우팅 선택 기능 제공:
- 표준 모드 (6홉): 최대 익명성을 위해 양측 모두 3홉 발신자 + 3홉 히든 서비스 라우팅 사용 (~800–1200ms RTT).
- 터보 모드 (단일 홉): 청취자 라우팅을 1홉으로 줄여 (~450–700ms RTT) 자연스러운 대화 음성을 제공하며, 명시적 트레이드오프 프롬프트 포함(청취자 노드에서 서버 위치 익명성 비활성화, 청취자 노드에서 아웃바운드 SOCKS 클라이언트 다이얼링 비활성화).
- 워키토키 푸시투토크 모드 -- 전체 음성 메시지를 녹음하고 버튼을 놓으면 전송합니다.
- 통화 중 암호화 채팅 -- 통화 중 암호화된 텍스트 메시지 송수신.
T를 눌러 메시지를 입력합니다. - 발신자 ID -- 연결 시 양측이 자동으로
.onion주소를 교환합니다. 원격 주소는 통화 헤더에 표시됩니다. - 자동 종료 감지 -- 한쪽이 끊으면 다른 쪽에 즉시 알림이 가고 통화가 자동으로 종료됩니다.
- 구성 가능한 암호화 방식 -- 강도별로 정렬된 21가지 엄선된 암호화 방식 중 선택 (256비트 → 128비트). AES, ChaCha20, Camellia, ARIA 계열 포함. 취약한 암호화 방식(DES, RC4, ECB 모드)은 제외됩니다.
- 실시간 암호화 방식 협상 -- 연결 시 양측이 암호화 방식 정보를 교환합니다. 통화 헤더에 로컬 및 원격 암호화 방식이 녹색(일치) 또는 빨간색(불일치) 표시기와 함께 실시간으로 업데이트되어 표시됩니다.
- 통화 중 설정 -- 통화 중
S를 눌러 설정에 접근합니다. 암호화 방식을 즉시 변경할 수 있으며 원격 측 디스플레이가 자동으로 업데이트됩니다. - Snowflake 브리지 정보 -- 검열 우회를 위해 Snowflake를 사용할 때 통화 페이지에 Tor 로그에서 파싱된 브리지 디스크립터 이름, 지문, 전송 연결 상태가 표시됩니다.
- 자동 청취 -- 활성화하면 Tor 부팅 시 백그라운드 리스너가 자동으로 시작됩니다. 수신 통화가 감지되어 "통화 청취"를 수동으로 선택하지 않아도 메인 메뉴에서 수락됩니다. 통화 종료 후 리스너가 자동으로 재시작됩니다.
- 구성 가능한 PTT 키 -- 기본 스페이스바에서 설정 메뉴를 통해 원하는 키로 푸시투토크 키를 변경할 수 있습니다.
- 메시지 통계 -- 통화 화면에 전송 및 수신 메시지의 암호화된 페이로드 크기가 제자리에서 업데이트되어 표시됩니다.
- 원격 PTT 상태 -- 통화 화면에 원격 측 상태가 정적 표시기로 표시됩니다: "대기" (녹색) 또는 "● 녹음 중" (빨간색). 오디오 데이터가 도착하면 재생 시작 전에 즉시 재설정됩니다.
- PTT 차임 -- 원격 측이 녹음을 시작할 때 선택적 알림음. sox로 생성된 5가지 내장 프리셋(톤, 더블, 처프, 딩, 클릭)과 사용자 지정 2초 차임 녹음 기능 포함. 설정에서 구성 가능합니다.
- 연결 애니메이션 -- 원격 주소로 전화할 때 통화 인터페이스가 로드될 때까지 순환 애니메이션이 재생됩니다.
- 음성 변조기 -- 발신 오디오에 음성 효과 적용. 6가지 프리셋(딥, 하이, 로봇, 에코, 위스퍼)과 피치 시프트, 오버드라이브, 플랜저, 에코, 하이패스 필터, 트레몰로가 포함된 완전 구성 가능한 사용자 지정 모드 제공. 효과는 Opus 인코딩 전에 sox로 처리됩니다.
- 볼륨 PTT (Termux) -- Termux가 백그라운드에 있어도 볼륨 다운 버튼을 두 번 탭하여 녹음을 토글할 수 있는 실험적 모드.
jq필요(요청 시 설치). 각 트리거 후 볼륨이 자동으로 복원됩니다. - Tor 히든 서비스 -- 각 인스턴스는 자체 Tor 히든 서비스를 실행합니다.
.onion주소는 영구적이고 라우팅 가능한 엔드포인트 역할을 합니다. 포트 포워딩이나 공용 IP가 필요 없습니다. - 종단 간 암호화 -- 모든 오디오와 텍스트는 Tor 네트워크에 진입하기 전에 사전 공유 비밀번호에서 PBKDF2 키 파생을 사용하여 구성 가능한 암호화 방식(기본값: AES-256-CBC)으로 암호화됩니다.
- 비밀번호 보호 시크릿 -- 공유 시크릿은 사용자가 선택한 비밀번호(AES-256-CBC, 100,000회 PBKDF2 반복)로 저장 시 암호화할 수 있습니다. 기존 평문 시크릿은 자동으로 감지되어 마이그레이션 제안이 표시됩니다.
- 저대역폭 -- Opus 코덱 16kbps, 8kHz 모노. 일반적인 10초 음성 메시지는 20KB 미만으로 Tor 용량에 충분합니다.
- QR 코드 공유 -- 옵션 3은 터미널에서
.onion주소를 스캔 가능한 QR 코드로 표시할 수 있습니다.qrencode가 설치되지 않은 경우 설치하라는 메시지가 표시됩니다. QR 코드는 대체 화면 버퍼에 렌더링되며 해제 시 제거됩니다. 일부 QR 스캐너가http://를 자동으로 앞에 붙인다는 경고 메모가 있으며, 이 접두사는 다이얼링 시 자동으로 제거됩니다. - 불투명 임시 파일 -- 모든 임시 파일은 일반
.tmp확장자와 무작위 16진수 식별자를 사용합니다. 파일 유형이나 타이밍 메타데이터가 파일 시스템에 유출되지 않습니다. - 회로 홉 표시 -- 통화 중 Tor 회로 경로를 선택적으로 표시하여 릴레이 이름과 전체 국가 이름을 보여줍니다. 60초마다 자동 새로고침. 설정 → Tor 설정에서 구성 가능합니다.
- 국가 제외 -- Tor 회로에서 특정 국가를 제외합니다. 파이브 아이즈, 나인 아이즈, 포틴 아이즈 동맹 프리셋 또는 사용자 지정 국가 코드 입력. torrc에서
StrictNodes와 함께ExcludeNodes를 사용합니다. - HMAC 프로토콜 인증 -- 공유 시크릿을 사용한 모든 프로토콜 메시지(음성, 텍스트, 제어 신호)의 선택적 HMAC-SHA256 서명. 메시지마다 무작위 논스가 포함되며, 재생 공격을 거부하기 위해 본 논스가 추적됩니다. 서명되지 않았거나 위조되었거나 재생된 메시지는 자동으로 폐기됩니다. HMAC 상태는 통화 시작 시 고정되어 통화 중간 동기화 불일치를 방지합니다. 설정 → 보안에서 구성 가능합니다.
- 삭제 전 덮어쓰기 -- 설정 → 보안의 선택적 토글. 삭제 전에
/dev/urandom의 무작위 데이터로 모든 임시 파일을 덮어씁니다. 파일 크기를 읽고,conv=notrunc를 사용한dd로 해당 바이트 수만큼 무작위 데이터를 파일에 쓰고,sync로 저장 장치에 쓰기를 플러시한 다음rm으로 파일을 제거합니다. 모든 민감한 런타임 파일을 포함합니다: 원시 PCM 녹음, Opus 인코딩 오디오, 암호화된 페이로드, 복호화된 인바운드 오디오 및 채팅, 음성 효과 중간 파일, 암호화 및 HMAC 키 자료, 논스 로그, 세션 플래그, PID 파일, 명명된 파이프, 회전 중인 Tor 히든 서비스 키, 릴레이 세션 데이터. 디렉토리의 경우 내부의 모든 파일이 재귀적으로 덮어써집니다. 내장 테스트 옵션은 샘플 파일을 생성하고 원본 내용을 평문과 16진수로 표시한 후 덮어쓰고 덮어쓴 16진수를 표시하여 사용자가 데이터가 파괴되었음을 시각적으로 확인할 수 있게 합니다. 기본적으로 꺼져 있음 — 대부분의 사용자에게 표준rm으로 충분합니다. TerminalPhone의 임시 파일은 작고 수명이 짧으며 디스크 공간은 일반적으로 정상적인 시스템 활동으로 빠르게 재사용됩니다. 이 기능은 포렌식 복구에 대한 추가 보호 계층을 원하는 사용자를 위한 것입니다. 참고: SSD 및 플래시 저장 장치에서는 웨어 레벨링으로 인해 덮어쓰기가 다른 물리적 NAND 셀에 기록될 수 있습니다 — 플래시 미디어에서는 전체 디스크 암호화만이 신뢰할 수 있는 방어책입니다. 기존 HDD에서는 덮어쓰기가 동일한 물리적 위치의 데이터를 대체하므로 모든 소프트웨어 기반 복구에 효과적입니다. - 릴레이 모드 (그룹 브리지) -- N명의 익명 발신자를 연결하는 제로 지식 릴레이를 실행합니다. 릴레이는 복호화 없이 암호화된 오디오와 채팅을 전달하며 공유 시크릿이나 오디오 하드웨어가 필요 없습니다. 클라이언트는
RELAY:1핸드셰이크를 통해 릴레이 모드를 자동 감지하고 실시간 그룹 발신자 수를 표시합니다. 한 발신자가 나가도 다른 발신자는 연결이 끊기지 않습니다. 운영자 대시보드에 발신자 수, 가동 시간, 데이터 처리량이 표시됩니다. - 단일 홉 Tor 모드 -- 릴레이 운영자를 위한 선택적 저지연 모드. 히든 서비스에 3홉 대신 1 Tor 홉을 사용하여 서버 익명성을 희생하고 지연 시간을 줄입니다. 자신의 IP를 숨길 필요가 없는 릴레이 운영자에게 이상적입니다.
- 포트 구성 -- 설정 → Tor 설정에서 수신 포트와 SOCKS 포트를 함께 구성합니다. 별도의 Tor 프로세스로 동일한 기기에서 여러 인스턴스를 실행할 수 있습니다. 주로 자신의 그룹 통화에 참여하려는 릴레이 운영자에게 유용합니다 — 한 인스턴스에서 릴레이를 실행하고 두 번째 인스턴스에서 SOCKS 포트를 변경한 다음 발신자로 다이얼하세요.
- 크로스 플랫폼 -- 표준 Linux 배포판, macOS, Termux를 통한 Android에서 실행됩니다. 플랫폼별 오디오 백엔드는 투명하게 처리됩니다.
- 루트 불필요 -- PTT 입력은 터미널 원시 모드를 사용합니다. 특별한 권한이나 커널 모듈이 필요 없습니다.
- 단일 스크립트 -- 하나의 Bash 파일. 빌드 시스템, 런타임, 프레임워크가 없습니다.
설치
Linux
지원 배포판: 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` | 온ion 라우팅 및 히든 서비스 |
| `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가 설치되어 있지 않으면 스크립트가 먼저 설치한 후 다음 패키지들을 설치합니다:
| 패키지 | 용도 |
|---|---|
tor | 온ion 라우팅 및 히든 서비스 |
opus-tools | 음성 압축 (Opus 코덱) |
sox | 오디오 녹음 및 재생 (rec, play) |
socat | Tor SOCKS 프록시를 통한 양방향 TCP 릴레이 |
openssl | AES-256-CBC 암호화 및 복호화 |
참고: macOS는 ALSA 대신 녹음(rec)과 재생(play) 모두에 sox를 사용합니다. 추가 오디오 패키지는 필요하지 않습니다.
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이 작동합니다.
Termux (Android)
TerminalPhone은 Termux를 통해 Android 기기를 지원합니다. Android의 샌드박스 오디오 아키텍처로 인해 두 가지 추가 구성 요소가 필요합니다.
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 전용 종속성:
| 패키지 | 용도 |
|---|---|
termux-api | Android 마이크 및 미디어 플레이어용 CLI 브리지 |
ffmpeg | Android의 M4A 녹음을 Opus 인코딩용 원시 PCM으로 변환 |
빠른 시작```
- Run: bash terminalphone.sh
- Install deps: Select option 7
- Start Tor: Select option 8 (wait for 100% bootstrap)
- Set shared secret: Select option 4 (both parties must use the same secret)
- Share your .onion address with the other party (option 3)
To receive a call: Select option 1 (Listen for calls) To make a call: Select option 2 (Call an onion address)
Both parties must have Tor running and the same shared secret configured before initiating a call.
---
## Usage
### Menu Options```
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
통화 중 제어
전이중 모드 (WebSockets):
| 키 | 동작 |
|---|---|
| M | 마이크 음소거 / 음소거 해제. |
| T | 통화 중 암호화된 문자 메시지 전송. |
| Q | 통화 종료 후 메뉴로 복귀. |
푸시투토크 모드 (Linux / macOS):
| 키 | 동작 |
|---|---|
| SPACE 길게 누르기 | 음성 메시지 녹음. 놓으면 자동 전송. |
| T | 암호화된 문자 메시지 전송. |
| S | 통화 중 설정 열기 (암호화 방식 변경, 품질 조정). |
| Q | 통화 종료 후 메뉴로 복귀. |
푸시투토크 모드 (Termux):
Android의 소프트웨어 키보드는 키를 누를 때가 아니라 뗄 때 키 이벤트를 전송합니다. TerminalPhone은 Termux에서 토글 모드를 사용하여 이를 대응합니다.
| 키 | 동작 |
|---|---|
| SPACE 탭 | 녹음 시작. 다시 탭하면 중지 및 전송. |
| T | 암호화된 문자 메시지 전송. |
| S | 통화 중 설정 열기 (암호화 방식 변경, 품질 조정). |
| Q | 통화 종료 후 메뉴로 복귀. |
| 볼륨 아래 ×2 | 볼륨 버튼으로 녹음 토글 (설정에서 볼륨 PTT 활성화 필요). |
CLI 모드```bash
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은 녹음 후 전송(record-then-send) 모델을 사용합니다. 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 연결을 통한 줄 기반 텍스트입니다:
| 메시지 | 설명 |
|---|---|
ID:<onion> | 발신자 ID -- 발신자의 .onion 주소 |
CIPHER:<name> | 발신자의 암호화 알고리즘. 연결 시 및 변경 시 교환됩니다. |
PTT_START | 발신자가 녹음을 시작했습니다 |
PTT_STOP | 발신자가 녹음을 마쳤습니다. 오디오가 뒤따르거나 전송되었습니다. |
AUDIO:<base64> | 완전한 암호화된 오디오 메시지 |
MSG:<base64> | 암호화된 텍스트 메시지 |
HANGUP | 발신자가 연결을 끊고 있습니다 |
PING | 연결 유지 신호 |
RELAY:1 | 릴레이 인사말 -- 릴레이가 연결 시 전송하며, 그룹 모드를 활성화합니다 |
GROUP:<n> | 그룹 크기 업데이트 -- 발신자가 참여하거나 떠날 때 릴레이가 브로드캐스트합니다 |
Termux에서는 Android의 기본 M4A 녹음 형식을 처리하기 위해 추가 변환 단계가 필요하며, ffmpeg를 사용하여 Opus 인코딩 전에 원시 PCM으로 변환합니다.
보안 모델
암호화: 모든 오디오는 전송 전에 사용자 구성 가능한 암호화 알고리즘(기본값: AES-256-CBC)으로 암호화됩니다. 21개의 선별된 암호화 알고리즘을 사용할 수 있으며, 가장 강력한 것(256비트)부터 적절한 것(128비트)까지 순위가 매겨져 있습니다. 키는 PBKDF2를 사용하여 10,000회 반복으로 사전 공유 비밀번호에서 파생됩니다. 암호화는 Tor의 전송 암호화와 독립적으로 애플리케이션 계층에서 적용됩니다. 비밀번호는 명령줄 인수가 아닌 파일 디스크립터(-pass fd:3)를 통해 OpenSSL에 전달되므로 프로세스 테이블에 노출되지 않습니다.
암호화 알고리즘 협상: 양측은 연결 시 및 통화 중 암호화 알고리즘이 변경될 때마다 암호화 알고리즘 이름을 교환합니다. 암호화 알고리즘 이름은 비밀이 아닙니다(커르크호프스의 원리). 로컬 및 원격 암호화 알고리즘이 일치하지 않으면 양측 모두 통화 헤더에 빨간색 표시기를 볼 수 있습니다.
전송: 모든 데이터는 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명의 청취자에게 팬아웃됩니다.
| 발신자 수 | 메시지당 아웃바운드 | 예상 경험 |
|---|---|---|
| 2--3 | 20--40KB | 대부분의 연결에서 안정적 |
| 3--5 | 40--80KB | 안정적인 회로에서 양호, 모바일 데이터에서는 지연 가능 |
| 5--10 | 80--180KB | 한계에 근접, 전송 간 눈에 띄는 지연 |
| 10+ | 180KB+ | 불안정, 상당한 대기열 및 잠재적 메시지 손실 |
현실적인 용량은 휴대폰(Termux)에서 실행되는 릴레이의 경우 3--5명의 발신자, 안정적인 연결을 갖춘 전용 Linux 머신의 경우 5--10명의 발신자입니다. 모바일 기기에서 실행되는 릴레이는 추가 제약에 직면합니다. 모바일 데이터는 Tor 위에 지연 시간을 추가하고, Android는 메모리를 확보하기 위해 백그라운드 Termux 프로세스를 종료할 수 있으며, 연결된 발신자마다 배터리 소모가 증가합니다. Tor 회로 대역폭은 경로 품질에 따라 50KB/s에서 500KB/s까지 다양할 수 있으며, 회로는 세션 중간에 저하되거나 회전할 수 있습니다. 단일 홉 모드는 처리량을 개선하지만 Tor 릴레이 혼잡을 제거하지는 않습니다. 이러한 추정치는 한 번에 한 사람만 전송하는 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 부트스트랩 실패:**
`.terminalphone/tor_data/tor.log`에서 Tor 로그를 확인하세요. 일반적인 원인으로는 시계 오차, Tor를 차단하는 네트워크 제한, 또는 동일한 SOCKS 포트를 사용하는 다른 Tor 인스턴스가 있습니다.
**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는 전체 네트워크 합의(consensus)를 처음부터 다운로드해야 하므로 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`로 스크립트를 기본 모드로 실행하세요.
---
[MIRROR V1.0.0](https://bin.disroot.org/?e1356291b098cb75#FMQ4gxFwgdr3rjR1dpGS2csLmDPzDEkQW16fQ5P2Vt4y)
[MIRROR V1.0.1](https://bin.disroot.org/?d3bc0b8976113f58#AuUm4ev4vfeVmPyrh2KjAdhDP6WN4UX6yKQh9ERGD5Qt)
[MIRROR V1.0.2](https://bin.disroot.org/?6bc5b2fd046de1d7#G7TmnytrMeaM5AZYWth6BjjdqUb9RDf3K9erHUExKcGX)
[MIRROR V1.0.3](https://bin.disroot.org/?c5010f039e4693fd#Brp1w7LRQH9d5Ye5npZDPxNVR855SW9QUAk9cJaUuLYX)
[MIRROR V1.0.4](https://bin.disroot.org/?1831f6b78e349142#7zaAMVPNJL3MfbGJzjtm6cCPcvQftf4ULXupdne5dRKw)
[MIRROR V1.0.5](https://bin.disroot.org/?edfcfc844987ed03#56LuBbqbkfNDXfHpydyaB3VcWYhYenX18dtSvNumERY9)
[MIRROR V1.0.6](https://bin.disroot.org/?6c7b4774108b0c1c#GQPst46zjAYidndmNvytforX7MK2LyHanL4d829vVcv4)
[MIRROR V1.0.7](https://bin.disroot.org/?047003637623b4fa#EwmaysciDpiDkht8xV7ce3QcR9oxFXaxSikh4cLheXBB)
[MIRROR V1.0.8](https://bin.disroot.org/?06e38bd64e6fbdad#88MYs3dmq9rSMkmocpW3NYaaG4YfSdRCc9LJnEEzqGYp)
[MIRROR V1.0.9](https://bin.disroot.org/?950218a9a7c71c66#E7Z94VCGBZozrfXYhGwKyAdMeTxuavg92tA1pn2DbrrB)
[MIRROR V1.1.0](https://bin.disroot.org/?0b0da14f31521b3a#B1c23J8xFoZZKErvGG28PgbtfgtMUcDABWmQEoSZfXgh)
[MIRROR V1.1.1](https://bin.disroot.org/?d8e2d4f0300eb5af#9Y1C8CkcH9jAmv1fh4GZs1yYpJmWCG5xG3SvDYdwnJam)
[MIRROR V1.1.2](https://bin.disroot.org/?b1059616f880925f#8ef2oscZXUkPAsJZwGfWvLPQagVAk5GgW4DyssmLvQpG)
[MIRROR V1.1.3](https://bin.disroot.org/?b02658801518aaa7#JE6CsBLWUwAnTdBqeHgeXL7QF5UExgi9rnygcfyMZjCJ)
[MIRROR V1.1.4](https://bin.disroot.org/?d31248fc44c287a0#HQELFWFEMpM9kfTZSGDXTdGFMVKTejox5CajF9Vm4Www)
[MIRROR V1.1.5](https://bin.disroot.org/?284b723ed6aad15f#8VCrrri6yRpdg3uVDSY94wpx7LYkw5uYhm4Vbhka83sM)
[MIRROR V1.1.5.1](https://bin.disroot.org/?26aaef1eff20c271#4GxQQPSDhrszTu1RmERySNVqD2fZW5GZwm3JeL1parpB)
[MIRROR V1.1.6](https://bin.disroot.org/?ae8270578cd9e081#BbcDLU49XqhecvwviHRcdfrZ4vhKdL2AMeKaT5v9oLV1)
[MIRROR V1.1.7](https://bin.disroot.org/?457e4308abe582d8#B9LJG88rmUwrGHHuCof8WpE8CXGmkc2tyrXXicEiJFWk)
[MIRROR V1.1.8](https://bin.disroot.org/?ef81486d3a5141a1#EN1YuLPqqs2FAEsvXkGbZdiWXt3vxvGTw845C4QsYmSn)
[MIRROR V1.1.9](https://bin.disroot.org/?fbcca457ac58964f#DsUCbJwgBRhnL1FK3a6VpwE5sCRNProXvk86u7RpWQM9)
---
## 라이선스
MIT