Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
punchline — Rust製のピアツーピア暗号化メッセンジャー(Noise IK と UDP NAT hole punching 使用) | Kitploit
ツール/GitHubGitHub/michal-pielka/punchline
暗号化/復号化ツールネットワークセキュリティプライバシーユーティリティとフレームワーク認証
GitHubmichal-pielka/punchline

punchline

Rust製のピアツーピア暗号化メッセンジャー(Noise IK と UDP NAT hole punching 使用)

リポジトリを見る
1924ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

punchline

エンドツーエンド暗号化されたピアツーピアチャット(UDP経由)。アカウント不要、中央サーバーによるメッセージの中継・保存なし、中間者なし。単なる2つのピア、直接接続、Noiseプロトコル暗号化。

https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05

目次

  • 機能概要
  • クイックスタート
  • 仕組み
  • CLIリファレンス
  • 使い方
    • 設定
    • ピアの管理
    • ステータス確認
    • サーバーオプション
    • テーマ設定
    • シェル補完
  • 暗号
    • IKハンドシェイク
    • イニシエーターの決定
    • 鍵の保存
  • ワイヤプロトコル
    • ホールパンチプロトコル
    • トランスポートプロトコル
    • シグナルプロトコル
    • STUNプロトコル
  • プロジェクト構成
  • インストール
    • crates.ioから
    • ソースからビルド
  • テストの実行
  • 技術スタック
  • ライセンス

機能概要

2人のユーザーが各自のマシンで punchline connect <peer> を実行します。PunchlineはNATを通過し、暗号化ハンドシェイクを実行し、プライベートチャットを開始します。所要時間はわずか数ミリ秒。内蔵のSTUNサーバーとシグナルサーバーが発見を処理した後、その後の通信には関与しません。 会話画面


クイックスタート

root@kitploit:~
cargo build --release

サーバーの起動(両方のピアから到達可能なマシン上で)。または、私が公開しているサーバー(64.225.107.28、STUN: ポート 3478、シグナリング: ポート 8743)を使用することもできます。

root@kitploit:~
punchline-stund                  # STUNサーバー - ピアに自身の公開IPを通知
punchline-signald                # シグナルサーバー - 通信したいピアをマッチング
サーバー画面

各ピアのマシンで:

root@kitploit:~
# 自身のID(X25519鍵ペア)を生成
punchline keygen

# 公開鍵を相手と共有
punchline pubkey

# 相手の鍵を保存
punchline peers add alice a1b2c3d4...64_hex_chars

# 接続(両方のピアがこのコマンドを実行し、互いを指定)
punchline connect alice --stun <server>:3478 --signal <server>:8743

TUIが起動し、接続進行状況がリアルタイムで表示されます。

  1. STUN探索 - punchline-stund 経由で自分の外部アドレスを解決

  2. シグナルサーバー - punchline-signald に接続

  3. ピア待ち - シグナルサーバーが両ピアをマッチング

  4. ホールパンチ - 直接UDP経路を確立

  5. Noiseハンドシェイク - 暗号化鍵交換

    ダッシュボード

完了後、チャット画面になります。文字を入力してEnterキーを押して送信。Escキーで終了します。


仕組み

システム全体は3つのバイナリで構成され、すべてこのリポジトリに含まれています。

バイナリ役割使用タイミング
punchline-stundSTUNサーバー(UDP) - クライアントの外部IP:ポートを返す

初期セットアップ後、STUNサーバーとシグナルサーバーには再アクセスしません。すべての通信は直接ピアツーピアで行われます。


CLIリファレンス

punchline

グローバルフラグ:

フラグ説明
-vログの詳細度を上げる(-v = デバッグ、-vv = トレース)。
-q, --quietすべてのログ出力を抑制。

punchline-stund

punchline-signald


使い方

設定

毎回 --stun と --signal を指定する代わりに、~/.config/punchline/config.toml を作成します。

root@kitploit:~
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"

ピアの管理

root@kitploit:~
punchline peers                              # 一覧表示
punchline peers add alice a1b2c3d4...        # 追加
punchline peers remove alice                 # 削除

エイリアスは ~/.punchline/known_peers.toml に保存されます。生の64文字の16進鍵を直接指定して接続することもできます。

ステータス確認

root@kitploit:~
punchline status

自身のID、設定、サーバー到達可能性(実際のSTUNプローブとTCP接続を送信)、ピア数を表示します。

サーバーオプション

両サーバーとも -v(デバッグ)、-vv(トレース)、-q(クワイエット)、--address、--port をサポートします。

root@kitploit:~
punchline-stund -v --port 3478
punchline-signald -v --port 8743

テーマ設定

~/.config/punchline/style.toml でTUIをカスタマイズできます。 動画で使用したスタイル:

root@kitploit:~
[colors]
my_text = "#ebdbb2"
peer_text = "#bdae93"
input_text = "#ebdbb2"
border = "#ebdbb2"
sidebar_key = "#ebdbb2"
sidebar_value = "#bdae93"

[padding]
chat_horizontal = 2
chat_vertical = 1

すべての色は16進RGBです。ファイルがない場合は、端末のデフォルト色が使用されます。

シェル補完

root@kitploit:~
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish

暗号

完全なプロトコル名: Noise_IK_25519_ChaChaPoly_SHA256

コンポーネント役割
Noise IKハンドシェイクパターン - イニシエーターはレスポンダーの公開鍵を事前に知っている。2メッセージで完了。
X25519

IKハンドシェイク

IKパターンでは、イニシエーターはハンドシェイク開始前にレスポンダーの静的公開鍵を知っている。両ピアはすでに互いの鍵を保持している(帯域外またはピアレジストリで交換済み)ため、初回接続時の信頼(TOFU)は不要。

  1. イニシエーター -> レスポンダー: イニシエーターの静的公開鍵を含む暗号化メッセージを、レスポンダーの既知の鍵で暗号化して送信。受動的監視者に対するID秘匿を提供。
  2. レスポンダー -> イニシエーター: 復号・検証し、返信。両サイドは共有セッション鍵でトランスポートモードに移行。

イニシエーターの決定

Punchlineは、各ピアの公開鍵の先頭8バイトをビッグエンディアンの u64 として比較し、決定論的にイニシエーターを選択します。値が小さい方がイニシエーターになります。両サイドが独立にこの計算を行います。

鍵の保存

IDは32バイトのX25519秘密鍵で、~/.punchline/id_x25519 にUnixパーミッション 0600 で保存されます。公開鍵は読み込み時に導出されます。鍵生成は x25519-dalek と OsRng を使用します。


ワイヤプロトコル

各UDPパケットの先頭バイトがタイプを識別します。

ホールパンチプロトコル

両方のピアが同時に同じアルゴリズムを実行します。

  1. 200msごとに相手の外部アドレスに PROBE(0x00)を送信。
  2. PROBE を受信したら、ACK(0x01)の送信に切り替え。
  3. ACK を受信したら、最後の ACK を1回送信し、成功を宣言。
  4. セーフティタイムアウト: ACKを2秒間送信しても応答がない場合、相手は完了したとみなす。

トランスポートプロトコル

メッセージ(0x02)はNoise暗号化されたUTF-8ペイロードを運びます。キープアライブ(0x03)は暗号化された空ペイロードで、10秒ごとに送信され、暗号ノンスの同期を維持します。30秒間パケットがないと切断されます。

シグナルプロトコル

WebSocket上のJSON:

root@kitploit:~
// PairRequest (クライアント -> サーバー)
{ "external_addr": "203.0.113.5:48291", "public_key": "a1b2...", "target_public_key": "d4e5..." }

// PairResponse (サーバー -> クライアント)
{ "target_external_addr": "198.51.100.7:51003", "target_public_key": "d4e5..." }

STUNプロトコル

RFC 5389(簡略版)に従います: バインディング要求/応答、XOR-MAPPED-ADDRESS。IPv4のみ。


プロジェクト構成

4つのクレートからなるCargoワークスペース:

root@kitploit:~
crates/
├── proto/      # 共有ライブラリ: 暗号、STUN、シグナルタイプ、トランスポートトレイト
├── client/     # P2Pクライアント: CLI、TUI、接続ロジック、ピア管理
├── signald/    # シグナルサーバー: WebSocketピアマッチング
└── stund/      # STUNサーバー: 外部アドレス探索

インストール

crates.ioから

root@kitploit:~
cargo install punchline           # TUIクライアント
cargo install punchline-signald   # シグナルサーバー
cargo install punchline-stund     # STUNサーバー

ソースからビルド

前提条件: Rust 2024エディション(rustc 1.85以上)

root@kitploit:~
git clone https://github.com/michal-pielka/punchline.git
cd punchline
cargo build --release

バイナリは target/release/ に配置されます:

  • punchline
  • punchline-signald
  • punchline-stund

テストの実行

root@kitploit:~
cargo test

テストは暗号操作、STUNエンコード/デコード、シグナルプロトコルシリアライゼーション、設定解析、ピア管理、スタイルテーマ、Noise IKハンドシェイクをカバーします。


技術スタック


ライセンス

MIT - LICENSE を参照してください。

ツールをダウンロード
セットアップ中のみ
punchline-signaldシグナルサーバー(WebSocket) - ピアをマッチングし、アドレスを交換セットアップ中のみ
punchlineメッセンジャー本体 - CLI、TUI、暗号、ホールパンチ常時
コマンド説明
keygen [--force] [-i パス]新しいX25519 ID鍵ペアを生成します。--force で上書き確認なし。-i で出力パスを指定。
pubkey [-i パス]公開鍵(64文字の16進数)を表示します。-i で特定の鍵ファイルから取得。
connect <peer> [-i パス] [--stun アドレス] [--signal アドレス]エイリアスまたは生の16進鍵でピアに接続します。-i でID鍵を指定。TUIを起動。
peers既知の全ピアを一覧表示。
peers add <名前> <鍵>ピアの公開鍵をニックネームで保存。
peers remove <名前>ニックネームでピアを削除。
config path設定ファイルのパスを表示。
config show現在の設定値を表示。
statusID、設定、サーバー到達可能性、ピア数を表示。
completions <シェル>シェル補完を生成(bash、zsh、fish)。
フラグ説明
--address <addr>バインドアドレス(デフォルト: 0.0.0.0)。
--port <port>バインドポート(デフォルト: 3478)。
-v / -vvデバッグ / トレースログ。
-qクワイエットモード。
フラグ説明
--address <addr>バインドアドレス(デフォルト: 0.0.0.0)。
--port <port>バインドポート(デフォルト: 8743)。
-v / -vvデバッグ / トレースログ。
-qクワイエットモード。
楕円曲線Diffie-Hellman鍵交換(RFC 7748)。128ビットセキュリティ、定数時間。
ChaCha20-Poly1305メッセージ暗号化のためのAEAD暗号(RFC 8439)。TLS 1.3やWireGuardでも使用。
SHA-256Noise内部で鍵導出とハンドシェイクハッシュに使用。
プレフィックスタイプフェーズ説明
0x00PROBEホールパンチ200msごとに送信、NATピンホールを開ける
0x01ACKホールパンチPROBEの受信確認
(なし)Handshakeハンドシェイク生のNoise暗号化ハンドシェイクペイロード
0x02Messageトランスポート暗号化されたチャットメッセージ
0x03Keepaliveトランスポート暗号化された空ペイロード(ハートビート)
クレート目的
snowNoiseプロトコルフレームワーク(ハンドシェイク + トランスポート暗号化)
x25519-dalekX25519鍵生成と導出
ratatuiターミナルUIフレームワーク
crosstermターミナルイベント処理
clapCLI引数解析 + シェル補完
tungsteniteWebSocketクライアント/サーバー
tracing構造化ロギング