
터미널 기반 암호화 메신저로, 포스트퀀텀 암호화, Double Ratchet 프로토콜, Tor 익명성을 제공합니다. duress passphrase, deniable authentication, seccomp-bpf 및 mlockall을 통한 OS 수준 강화 기능을 갖추고 있습니다.
op4 — 보안 터미널 메신저
Op4는 Rust로 작성된 터미널 기반 암호화 메시징 애플리케이션입니다. 양자 내성 암호화를 사용한 종단간 암호화 개인 메시징을 제공하며, 모든 트래픽은 Tor 네트워크를 통해 라우팅되어 메시지 내용이나 IP 주소가 상대방을 포함한 누구에게도 노출되지 않습니다.
op4는 두 사람이 IP 주소나 실제 신원을 노출하지 않고 개인 메시지를 교환할 수 있게 합니다. 모든 메시지는:
op4는 터미널에서만 실행됩니다. GUI, 브라우저 구성 요소, 클라우드 계정이 없습니다. 외부 프로세스로는 사용자 기기에서 실행 중인 Tor 데몬에만 접촉합니다.
모든 다운로드 옵션 – AppImage, 소스 tarball, 클론 및 빌드, 자동 설치 프로그램은 다운로드 및 설치 가이드에 문서화되어 있습니다. 최신 릴리스는 릴리스 페이지에서 확인할 수 있습니다.
Debian 및 Ubuntu에서 install/setup.sh는 하나의 명령으로 모든 것을 처리합니다: Rust 도구 체인, 빌드 종속성, Tor, 제어 포트 구성, 바이너리 컴파일, 시스템 사용자, 데이터 디렉터리 및 AppArmor 프로필.
git clone https://github.com/Opfour/op4.git
cd op4
sudo bash install/setup.sh
스크립트가 완료된 후 op4를 실행하기 전에 반드시 로그아웃 후 다시 로그인해야 합니다. 설치 프로그램은 사용자를
debian-tor그룹에 추가하여 Tor 쿠키 파일을 읽을 수 있도록 합니다. Linux는 이미 열려 있는 세션에 그룹 변경을 적용하지 않으므로 새 로그인이 필요합니다.이 단계를 건너뛰면 op4 시작 시 다음 오류가 발생합니다:
/run/tor/control.authcookie 읽기 권한 거부됨
그런 다음 스크립트에서 출력된 소스 해시를 해당 버전에 대해 게시된 릴리스 해시와 비교하여 바이너리를 신뢰하기 전에 확인하세요.
op4가 시작되면 모든 Rust 소스 파일, Cargo.toml, Cargo.lock, build.rs를 포함하는 소스 해시를 출력합니다. 설치한 버전에 대해 아래 값과 비교하세요.
전체 앱을 실행하지 않고도 확인할 수 있습니다:
op4 --print-hash
해시가 일치하지 않으면 바이너리를 사용하지 마십시오 — 다른 커밋에서 빌드되었거나 변조된 것입니다.
먼저 종속성을 설치한 다음 스크립트를 실행하세요:
Rust 도구 체인 (rust-toolchain.toml을 통해 1.89.0으로 고정):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Tor 및 빌드 종속성:
# Fedora
sudo dnf install tor gcc pkg-config openssl-devel
# Arch
sudo pacman -S tor base-devel pkg-config openssl
Tor 제어 포트 구성 – /etc/tor/torrc에 추가:
ControlPort 9051
CookieAuthentication 1
sudo systemctl restart tor
Tor 그룹에 사용자 추가:
sudo usermod -aG tor $USER # Fedora / Arch
이 단계 후에는 반드시 로그아웃 후 다시 로그인해야 합니다. 그룹 멤버십 변경은 활성 세션에 적용되지 않습니다. 그렇지 않으면 op4가
Permission denied reading /run/tor/control.authcookie오류로 실패합니다.완전히 로그아웃하지 않고 변경 사항을 적용하려면 다음을 실행하세요:
newgrp tor
빌드 및 설치:
git clone https://github.com/Opfour/op4.git
cd op4
cargo build --release
sudo bash install/setup.sh
op4
# 또는 시스템 설치 없이:
./target/release/op4
첫 실행 시 op4는 일반 암호와 강요 암호를 설정하도록 안내한 후 신원 키를 생성합니다. 볼트는 ~/.local/share/op4/vault.op4에 저장됩니다.
최소 커널: 4.15 (5.4+ 권장). 아키텍처: x86-64 (aarch64는 작동해야 하지만 테스트되지 않음).
두 사람 모두 op4가 설치되고, Tor가 실행 중이며, 볼트가 잠금 해제되어 있어야 합니다. 교환은 비대칭적입니다: 한 사람이 먼저 연락처 코드를 보내고, 다른 사람이 추가한 다음 첫 번째 메시지를 보내면, 첫 번째 사람이 수락할 때까지 보류 중인 요청으로 도착합니다.
첫 실행 시 op4는 일반 암호와 강요 암호를 입력하도록 요청한 후 신원 키를 생성합니다. 이는 한 번만 발생합니다. 볼트는 ~/.local/share/op4/vault.op4에 저장됩니다.
$ op4
연락처 코드에는 전체 공개 키 번들과 .onion 주소가 포함되어 있습니다. 상대방이 귀하에게 연락하려면 이 코드가 필요합니다.
2 또는 → 누름)e 를 눌러 연락처 코드 내보내기op4:로 시작하는 긴 Base58 문자열입니다.연락처 코드는 비밀이 아닙니다. 공개적으로 공유해도 안전합니다. 공개 키와 onion 주소만 포함되어 있으며 비밀 자료는 없습니다.
상대방의 연락처 코드를 받은 후:
a 를 눌러 연락처 추가op4: 연락처 코드를 붙여넣고 Enter 누름↑/↓ 사용, 그 다음 Enter)3 또는 → 누름)이 첫 번째 메시지는 암호화된 핸드셰이크를 시작하고 Tor를 통해 상대방의 .onion 주소로 전달됩니다. 상대방은 이를 보류 중인 연락처 요청으로 보게 됩니다.
누군가 첫 메시지를 보내면 연락처 탭에 대기 중인 요청 수를 표시하는 배지가 나타납니다.
2 누름)p 를 눌러 보류 중인 요청 검토Esc 를 눌러 폐기)수락되면 Double Ratchet이 초기화되고 대화가 즉시 메시지 탭에서 사용 가능해집니다.
연락처를 신뢰하기 전에 상대방이 자신의 화면에서 보여주는 지문과 일치하는지 확인하세요. 이는 초기 연락처 교환 중 중간자 공격을 방지합니다.
A3F2:91BC:…)이 표시됩니다신원 키가 손상되었다고 생각되면:
4 또는 오른쪽으로 이동)r 을 눌러 키 회전op4는 전방향 보안을 위해 Double Ratchet 프로토콜(Signal Protocol과 유사)을 사용합니다. 즉:
KEM 단계는 X25519와 ML-KEM-768을 다음과 같이 결합합니다:
shared_secret = HKDF(X25519_ss || MLKEM_ss)
공격자는 키 교환을 손상시키기 위해 두 알고리즘을 모두 깨야 합니다. 이는 양자 공격자(ML-KEM-768)로부터 보호하면서 ML-KEM-768에 알려지지 않은 결함이 있을 경우(X25519 폴백) 기존 공격에 대해 안전하게 유지됩니다.
메시지는 공유 래칫 상태에서 파생된 키를 사용하여 HMAC-SHA256으로 인증됩니다. 양측이 동일한 HMAC 키를 보유하고 있기 때문에 어느 쪽이든 주어진 MAC을 생성할 수 있습니다. 이는 OTR 및 Signal에서 사용하는 것과 동일한 부인 방지 속성입니다: 법정 절차에서 메시지를 암호화 방식으로 특정 발신자에게 귀속시킬 수 없습니다.
~/.local/share/op4/vault.op4의 볼트 파일은 모든 연락처, 대화 및 신원 키를 저장합니다. 두 개의 독립적인 Argon2id 파생 키로 보호됩니다:
op4는 받은 편지함을 위해 Tor v3 히든 서비스를 생성합니다. .onion 주소는 신원 키에서 결정론적으로 파생되므로(HKDF 사용) 별도의 키를 저장할 필요 없이 재시작 후에도 안정적입니다. 발신 메시지는 Tor SOCKS5 프록시를 통해 전송됩니다. op4와 관련된 네트워크 패킷에 실제 IP 주소가 나타나지 않습니다.
커버 트래픽(평균 간격 30초의 푸아송 분포 더미 메시지를 자신에게 전송)은 트래픽 양을 관찰하여 네트워크 관찰자가 누군가와 활발히 메시지를 주고받는지 알 수 없도록 합니다.
apparmor/op4.profile) — 파일 시스템 액세스를 볼트 디렉터리, 터미널 장치 및 Tor로만 제한합니다.┌─────────────────────────────────────────────────────────────┐
│ op4 프로세스 │
│ │
│ ┌──────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ TUI │ │ Double Ratchet │ │ Tor Transport │ │
│ │ (ratatui)│──▶│ + 하이브리드 PQ │──▶│ nym_client.rs │ │
│ │ │ │ 암호 │ │ │ │
│ └──────────┘ └──────────────────┘ └───────┬────────┘ │
│ │ │
│ ┌──────────────────────────────┐ │ │
│ │ 암호화된 볼트 │ SOCKS5 / 제어 포트 │
│ │ ~/.local/share/op4/vault.op4│ │ │
│ └──────────────────────────────┘ │ │
└────────────────────────────────────────────────┼───────────┘
│
┌────────────▼────────────┐
│ Tor 데몬 │
│ 127.0.0.1:9050 (SOCKS) │
│ 127.0.0.1:9051 (제어) │
└────────────┬────────────┘
│
Tor 네트워크
│
┌────────────▼────────────┐
│ 상대방의 .onion 주소 │
│ (상대방의 히든 서비스) │
└─────────────────────────┘
op4/
├── src/
│ ├── main.rs 진입점, 시작 시퀀스
│ ├── error.rs 통합 오류 유형
│ ├── crypto/
│ │ ├── keys.rs 하이브리드 KEM + 서명 키 쌍
│ │ ├── primitives.rs AEAD, HKDF, HMAC, Argon2id
│ │ ├── ratchet.rs Double Ratchet 구현
│ │ ├── hmac_auth.rs 부인 방지 인증 태그
│ │ └── handshake.rs 초기 키 합의 (X3DH 스타일)
│ ├── network/
│ │ ├── nym_client.rs Tor 히든 서비스 전송
│ │ └── message.rs 와이어 메시지 형식 + 패딩
│ ├── storage/
│ │ └── vault.rs 암호화된 볼트 (Argon2id + AEAD)
│ ├── identity/
│ │ ├── profile.rs 연락처 코드, 저장된 연락처
│ │ └── revocation.rs 키 폐기 기록
│ ├── hardening/
│ │ ├── memory.rs mlockall, RLIMIT_CORE, dumpable
│ │ └── seccomp.rs seccomp-bpf 시스템 호출 필터
│ └── ui/
│ ├── app.rs TUI 이벤트 루프 및 상태 기계
│ ├── contacts.rs 연락처 탭 렌더링
│ ├── conversation.rs 메시지 탭 렌더링
│ ├── settings.rs 설정 탭 렌더링
│ ├── duress.rs 강요 받은 편지함 렌더링
│ ├── input.rs 입력 정제 (CSI/OSC 제거)
│ └── passphrase.rs 안전한 암호 프롬프트
├── apparmor/
│ └── op4.profile AppArmor MAC 프로필
├── install/
│ └── setup.sh 시스템 설치 스크립트
├── build.rs 컴파일 시 소스 해시 포함
├── deny.toml cargo-deny 라이선스 + 권고 규칙
├── rust-toolchain.toml Rust 1.89.0 고정
└── docs/ 이 문서
버전: 0.2.0-dev (프리릴리스)
op4는 활발히 개발 중입니다. 다음 계층은 완전하고 테스트되었습니다:
모든 계층이 이제 종단간 연결되었습니다:
PublicKeyBundle(전체 공개 키 세트 + onion 주소)을 생성합니다.알려진 모든 제한 사항이 해결되었습니다. 애플리케이션은 이제 0.2.0-dev의 기능 완료 상태에 있습니다:
HMAC 부인 방지 인증이 완전히 연결되었습니다. 모든 발신 데이터 메시지는 메시지별 래칫 키에서 파생된 HMAC-SHA256 태그를 (conversation_id || message_counter || ciphertext)에 대해 계산하여 전달합니다. 수신 메시지는 수락되기 전에 확인됩니다. 이전 버전과의 호환성을 위해 이전 피어의 0으로 채워진 태그는 허용됩니다.
메시지 기록은 다시 시작 후에도 유지됩니다. 전체 대화 로그는 대화별 HKDF 파생 키로 암호화되어 볼트의 message_log_ct 필드에 저장됩니다. 대화가 열릴 때 볼트에서 메시지를 로드하고, 전송 또는 수신 후 다시 작성합니다.
알 수 없는 상대방으로부터의 수신 연락처 요청이 삭제되지 않고 대기열에 추가됩니다. 연락처 탭에 요청이 대기 중일 때 배지가 표시됩니다. [p]를 눌러 검토: 발신자의 지문과 첫 메시지가 표시되고, 이름을 입력한 후 Enter를 눌러 수락(또는 Esc를 눌러 거부)합니다. 수락 시 연락처가 추가되고 Double Ratchet이 초기화되며 초기 메시지가 볼트에 저장됩니다.
강요 볼트가 저장 시 유지됩니다. 볼트 파일 형식(v2)은 헤더에 정확한 암호문 길이를 저장하므로 AEAD 복호화가 0으로 채워진 섹션이 아닌 실제 바이트에 대해 작동합니다. 암호화된 강요 섹션은 모든 save() 호출에서 그대로 저장되어 강요 암호가 무기한 유효합니다.
전용 Double Ratchet 부트스트랩 키. 첫 실행 시 별도의 X25519 키 쌍(identity_ratchet_secret)이 생성되어 연락처 코드에 ratchet_pub으로 포함됩니다. Alice의 래칫은 Bob의 KEM 신원 키가 아닌 Bob의 ratchet_pub으로 초기화되어 키 역할을 분리합니다.
설정 탭이 완전히 기능합니다. Tor SOCKS5 주소 및 자동 삭제 임계값을 인라인으로 편집할 수 있습니다. 키 회전(새 키 쌍 생성, 서명된 폐기 인증서를 모든 연락처에 브로드캐스트, 내보내기 코드 갱신) 및 키 폐기 철회가 모두 연결되어 작동합니다.
키 폐기가 종단간 연결되었습니다. RevocationCertificate 구조체는 하이브리드 Ed25519+ML-DSA-65 키 쌍으로 서명되어 메시지로 Tor를 통해 모든 연락처에 전송됩니다.
| 버전 | 소스 해시 |
|---|
0.3.0 | 80820cb41a63575d2c139dadd425d13d1e87e62a9d60200ae7b894ae2e9ad8ed |
0.3.1 | 48115efb12747fa78b627ddbf7a56c46169f59e777d7d7508941bf89e4fe7521 |
0.2.0-dev | 35740577f6c4a4f19c5a08fe85b1f78a10347f2ba9dd7642d126552266bfa5a5 |
0.1.0 | e1a94761c7d3fa589ba892b47d5295aa417f95aee126809d51a7e7fb7e78982c |
| 배포판 | 상태 |
|---|
| Ubuntu 22.04 / 24.04 | 지원 |
| Debian 12 | 지원 |
| Fedora 39+ | 지원 |
| Arch Linux (현재) | 지원 |
| Tails OS | 지원 (설정 가이드) |
| macOS / Windows / WSL1 | 미지원 |
| 키 | 동작 |
|---|
1 / ← → | 탭 전환 (연락처 / 메시지 / 설정) |
↑ ↓ | 선택 이동 |
Enter | 대화 열기 / 확인 |
Esc | 취소 / 뒤로 가기 |
e | 연락처 코드 내보내기 (연락처 탭) |
a | 연락처 추가 (연락처 탭) |
p | 보류 중인 요청 검토 (연락처 탭) |
d | 선택한 연락처 삭제 (연락처 탭) |
r | 키 회전 (설정 탭) |
q | 종료 |
| 목적 | 알고리즘 |
|---|
| 볼트 키 파생 | Argon2id (m=64 MiB, t=3, p=1) |
| 볼트 암호화 | ChaCha20-Poly1305 (256비트 키, 96비트 nonce) |
| 메시지 암호화 | ChaCha20-Poly1305 (래칫에서 파생된 메시지별 키) |
| 키 파생 (래칫) | HKDF-SHA256 |
| 부인 방지 인증 | HMAC-SHA256 |
| 기존 키 교환 | X25519 |
| 양자 내성 키 교환 | ML-KEM-768 (FIPS 203) |
| 기존 서명 | Ed25519 |
| 양자 내성 서명 | ML-DSA-65 (FIPS 204) |
| 전송 익명성 | Tor v3 히든 서비스 (.onion) |
WireMessageType::Revocation