CLI · コマンドラインで結ぶ
端末から、
糸を結ぶ。
musubiバイナリの全機能を、コピー&ペースト可能な実例で解説します。 鍵の生成から暗号化・復号、シェルパイプライン、v0.2 の織りモード、 そしてつまずきやすいエラーまで一気通貫。
§01 · QUICKSTART
5 行クイックスタート
ともかく動かしてみたいなら、これだけです。 Rust ツールチェーンが入っていることが前提( §02 で詳述)。
quickstart
# musubi をインストール▎ cargo install --git https://github.com/masaki-09/musubi musubi-cli# 鍵を作って保存▎ musubi keygen -o my.key# 暗号化と復号▎ echo "あいしてる" | musubi encrypt -k my.key -o love.json▎ musubi decrypt -k my.key -i love.jsonあいしてる
これで関係性暗号の往復が完了しました。 鍵はあなたのファイルシステムから一歩も出ていません。
§02 · INSTALL
インストール
v0.2 時点では公式バイナリ配布はまだなく、Rust ツールチェーンを使ってソースから入れます。 三通りの選択肢があります。
A. cargo で git から直接(推奨)
musubi — bash
▎ cargo install --git https://github.com/masaki-09/musubi musubi-cliCompiling musubi-core v0.2.0Compiling musubi-cli v0.2.0Installing ~/.cargo/bin/musubi
バイナリ musubi が ~/.cargo/bin/ に置かれます。 cargo の標準パスが $PATH に通っていれば、 そのまま musubi --help が走ります。
B. 特定タグを指定して固定
本番運用や授業で使うなら、バージョンを固定しておくのが安全です。
musubi — bash
▎ cargo install --git https://github.com/masaki-09/musubi --tag v0.2.0 musubi-cliC. ソースからクローンしてビルド
挙動を覗きたい・パッチを当てたいときはこちら。
musubi — bash
▎ git clone git@github.com:masaki-09/musubi.git▎ cd musubi▎ cargo build --release -p musubi-cli▎ ./target/release/musubi --help
§03 · OVERVIEW
コマンド全体像
musubi は 3 つのサブコマンドだけで成立しています。
musubi <SUBCOMMAND> [FLAGS] サブコマンド: keygen 新しい鍵を生成する encrypt 平文を暗号文 (JSON) に変換する decrypt 暗号文 (JSON) を平文に戻す
どのサブコマンドも次の規約に従います:
-i / --input <FILE>を省くと 標準入力から読みます。-o / --output <FILE>を省くと 標準出力に書きます。- すべての I/O は UTF-8。 暗号文・鍵は読みやすい整形 JSON で出力(
--compactで 1 行化可)。 - 終了コードは 0 = 成功、 0 以外 = 失敗。 エラーメッセージはすべて stderr に流れる。
ファイルを書きたくないなら、書かなくていい。 標準入出力でつなげば、ディスクを汚さずに恋文を結べます。
§04 · KEYGEN
musubi keygen
default-v1 アルファベット 175 文字の 順列を一つ生成します。 OS の暗号学的乱数源(OsRng)を使うので、 物理乱数に近い品質の鍵が得られます。
| フラグ | 型 | 既定 | 説明 |
|---|---|---|---|
| -o, --output <FILE> | PATH | — | 鍵の出力先。省略時は stdout。 |
| --seed <U64> | u64 | — | PRNG をシード値で固定し、再現可能な鍵を生成。 デバッグ・テスト用。 本番では絶対に使わないこと。 |
keygen の例
# 本番用:OS 乱数で鍵を生成してファイルへ▎ musubi keygen -o my.key# 標準出力に直接出して less で見る▎ musubi keygen | less# テスト用:シードを固定(同じシードで同じ鍵)▎ musubi keygen --seed 42 -o test.key
鍵ファイルの中身
鍵 JSON は次の形式です。 permutation はアルファベット順序のシャッフル結果なので、 それ自体が秘密になります。
{
"alphabet": "default-v1",
"permutation": [
"ぬ", "ぃ", "ろ", "G", "に", "を", "ぱ", "ば",
"ゅ", "Q", "ど", "[", "ょ", "そ", "ぼ", "へ",
... // 175 文字すべての並び
]
}§05 · ENCRYPT
musubi encrypt
平文を読み込み、関係性暗号として JSON を吐きます。 v0.2 で --strategy, --noise, --seed が増えました。
| フラグ | 型 | 既定 | 説明 |
|---|---|---|---|
| -k, --key <FILE>必須 | PATH | — | musubi keygen で作った鍵ファイル。 |
| -i, --input <FILE> | PATH | — | 平文入力。省略時は stdin。 |
| -o, --output <FILE> | PATH | — | 暗号文 JSON の出力先。省略時は stdout。 |
| -a, --anchor <POS> | usize | n / 2 | アンカー位置(0 始まり)。指定しなければ平文長の中央。 |
| --compact | flag | — | 整形しない 1 行 JSON を出力。シェルで取り回しやすい。 |
| --strategy <S> | canonical | chain | canonical | エンコーダ戦略。 canonical は v0.1 互換の隣接参照、 chain は v0.2 の多重結び(ランダム木)。 |
| --noise <N> | usize | 0 | 平文に含まれないダミー文字を N 個織り込む(迷い糸)。 自動的に chain モードへ。 平文長そのものが見えなくなる。 |
| --seed <U64> | u64 | — | chain / noise が使う乱数のシード。 デモ・テスト・パズル配布で同じ暗号文を複数回出したいときに。 |
アンカー位置の選び方
アンカーは唯一平文中の文字が露出する位置です。 何も指定しなければ n / 2 (中央)になります。 露出しても困らない文字を意図的に選ぶと、ロマンに繋がります。
アンカー位置を変えてみる
# 「あいしてる」のアンカーを 2 (=し) に固定▎ echo "あいしてる" | musubi encrypt -k my.key -a 2# アンカーを末尾 (=る) に▎ echo "あいしてる" | musubi encrypt -k my.key -a 4
暗号文 JSON の構造
v0.2 で ext フィールドが増えましたが、ノイズ無しなら省略されます。
{
"version": 1,
"alphabet": "default-v1",
"length": 5,
"anchor": { "position": 2, "character": "し" },
"relations": [
{ "kind": "shift", "reference": 1, "delta": -1 },
{ "kind": "shift", "reference": 2, "delta": -10 },
null,
{ "kind": "shift", "reference": 2, "delta": 7 },
{ "kind": "shift", "reference": 3, "delta": 20 }
]
// ノイズあり時のみ:
// "ext": { "plaintext_indices": [2, 5, 4, 1, 7] }
}各フィールドの意味は 理論ページ §06 完全な例題で δ の計算まで踏み込んで解説しています。
§06 · DECRYPT
musubi decrypt
暗号文 JSON を読み、平文を書き戻します。 ext.plaintext_indices の有無を自動で判別するので、 受信者側はノイズの有無を意識する必要がありません。
| フラグ | 型 | 既定 | 説明 |
|---|---|---|---|
| -k, --key <FILE>必須 | PATH | — | 送信者と共有している鍵。 |
| -i, --input <FILE> | PATH | — | 暗号文 JSON。省略時は stdin。 |
| -o, --output <FILE> | PATH | — | 平文の出力先。省略時は stdout。 |
復号の例
# ファイルから読んで stdout へ▎ musubi decrypt -k my.key -i love.jsonあいしてる# stdin から読んでファイルへ▎ cat love.json | musubi decrypt -k my.key -o plain.txt
§07 · PIPELINES
パイプとファイル
標準入出力で完結するので、シェルパイプラインに自然に乗ります。
ディスクに何も残さない一往復
musubi — bash
▎ echo "あいしてる" | musubi encrypt -k my.key | musubi decrypt -k my.keyあいしてる
複数行の手紙を結ぶ
musubi — bash
▎ musubi encrypt -k my.key -i letter.txt -o letter.cipher.json# 受信者側▎ musubi decrypt -k my.key -i letter.cipher.json -o recovered.txt▎ diff letter.txt recovered.txt(差分なし — 完全に一致)
圧縮 / 転送と組み合わせる
musubi — bash
# JSON を圧縮して USB に書き出す▎ musubi encrypt -k my.key -i letter.txt --compact | gzip > /media/usb/letter.cipher.gz# 受信側で展開して復号▎ gunzip -c /media/usb/letter.cipher.gz | musubi decrypt -k my.key
§08 · WEAVING
v0.2「織り」の使い方
v0.2 で増えたフラグは独立に効きます。 単独でも組み合わせでも使えます。
多重結び(chain)
関係グラフをアンカー中心の隣接パスから、 アンカーを根とするランダム木に変えます。 暗号文の構造が一目で読み取れなくなります。
musubi — bash
▎ echo "あいしてる" | musubi encrypt -k my.key --strategy chain --seed 7迷い糸(noise)
ダミー文字を N 個織り込みます。 受信者は鍵の力で本物だけ拾い、 第三者には平文長すら不明になります。
musubi — bash
▎ echo "あいしてる" | musubi encrypt -k my.key --noise 5... "length": 10, "ext": { "plaintext_indices": [...] } ...
シードで再現性を確保
--seed を指定すると chain / noise の RNG が固定され、 同じ平文・同じ鍵・同じシードからは常にバイト一致の暗号文が出ます。 パズル配布や授業デモに便利です。
musubi — bash
▎ echo "musubi" | musubi encrypt -k my.key --strategy chain --seed 555 --compact{"version":1,"alphabet":"default-v1","length":6,...}# もう一度同じシードで実行 → バイト単位で同じ JSON▎ echo "musubi" | musubi encrypt -k my.key --strategy chain --seed 555 --compact{"version":1,"alphabet":"default-v1","length":6,...}
§09 · SCENARIOS
シナリオ集
A. 一通の恋文を結ぶ
letter.txt に書いた手紙を、 アンカー位置「し」(相手の名前の頭文字)で暗号化し、 USB で渡す段取り。
musubi — bash
▎ musubi keygen -o keys/letter.key▎ musubi encrypt -k keys/letter.key -i letter.txt -a 0 -o letter.cipher.json# 鍵 + 暗号文を相手に物理で渡す▎ cp keys/letter.key letter.cipher.json /media/usb/
B. 二人で日常的に往復する
共有鍵を作り、 2 人ともそれを保管。 メッセージはテキスト経由でやり取り。
musubi — bash
# 対面で 1 度だけ鍵生成して両者に配布▎ musubi keygen -o shared.key# 送信側▎ musubi encrypt -k shared.key --compact▎ 明日、また会えますように。{"version":1,...}# 受信側 — JSON を貼り付けて復号▎ musubi decrypt -k shared.key
C. 解読パズルを配布する
セミナーや結婚式の余興で、シードを固定してバイト一致の暗号文を作り、 紙に印刷して配るやり方。 --noise を入れて長さを欺くと、難易度が一段上がります。
musubi — bash
▎ musubi keygen --seed 1234 -o puzzle.key▎ echo "あいしてる" | musubi encrypt -k puzzle.key --noise 4 --seed 99 --compact > puzzle.json# 印刷用に鍵と暗号文を別の紙に
§10 · TROUBLESHOOTING
エラーと対処
よく出るエラーメッセージと、その意味・対処法。
character "、" is not in the alphabet
default-v1 アルファベット(五十音 + ASCII)に含まれない文字が平文に混じっています。 「、」「。」「世」「界」など、句読点や漢字は対象外です。
musubi — bash
▎ echo "こんにちは、世界" | musubi encrypt -k my.keyError: character "、" is not in the alphabet
対処:句読点を取り除くか、ローマ字で書く。 漢字は将来的な拡張アルファベットでサポートする可能性があります。
plaintext is empty
空文字列を渡すとこのエラーになります。 musubi はアンカー文字を 1 つ必要とするため、 最低でも 1 文字の入力が要ります。
anchor position N is out of range for length M
-a N が平文長 Mより大きい/等しい。 0 ≤ N < M を満たすように指定し直してください。
ciphertext alphabet "default-v1" does not match expected "..."
鍵と暗号文が違うアルファベットを使っています。 多くの場合、 異なるバージョンや異なる鍵で作った暗号文を間違えて読んでいます。
relation graph has cycles or unreachable positions
暗号文が壊れている/改竄されている可能性があります。 ファイルが途中で切れていないか、 v0.1 デコーダで v0.2 noise 入り暗号文を読んでいないかを確認してください。
PowerShell の文字化け(????? になる)
Windows PowerShell(特に 5.1)でこんな現象になることがあります:
PowerShell の典型的なハマり
▎ musubi keygen -o my.key▎ echo "あいしてる" | musubi encrypt -k my.key -o love.json▎ musubi decrypt -k my.key -i love.json?????
原因: これは musubi のバグではなく PowerShell のエンコーディング既定値の問題です。 PS 5.1 はネイティブコマンドへパイプするとき、既定で $OutputEncoding が ASCII に設定されており、 パイプを通った瞬間に「あいしてる」がリテラルの ????? に潰されるからです。 musubi の側はその ? を正しく暗号化・復号しただけ、というオチです。
解決策 A — このセッションだけ UTF-8 にする
musubi — bash
▎ [Console]::InputEncoding = [System.Text.UTF8Encoding]::new()▎ [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()▎ $OutputEncoding = [System.Text.UTF8Encoding]::new()# ここで先のコマンドをやり直すと「あいしてる」が戻る
3 行とも必要です。 $OutputEncoding は PS → ネイティブコマンド方向、 [Console]::OutputEncoding は musubi の標準出力 → 画面方向、 [Console]::InputEncoding は musubi の標準入力読み取り方向を、それぞれ UTF-8 に揃えます。
解決策 B — プロファイルに書いて永続化
musubi — bash
▎ Add-Content -Path $PROFILE -Value @'▎ [Console]::InputEncoding = [System.Text.UTF8Encoding]::new()▎ [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()▎ $OutputEncoding = [System.Text.UTF8Encoding]::new()▎ '@# 新しいセッションから自動で UTF-8 になる
解決策 C — エンコーディングを触らずファイル経由で確実に動かす
musubi — bash
▎ "あいしてる" | Set-Content -Encoding utf8 -NoNewline plain.txt▎ musubi encrypt -k my.key -i plain.txt -o love.json▎ musubi decrypt -k my.key -i love.jsonあいしてる
Set-Content -Encoding utf8 は UTF-8 で書き出すので musubi が正しく読み取れます。 -NoNewline を付けないと末尾改行が入って復号結果末尾に余分な空行が出ますが、 musubi 側で末尾改行は自動で除去されるため、付けなくても問題ありません。
§11 · ENVIRONMENT
環境とビルド
- MSRV: Rust 1.75。
rustup default stableで十分。 - OS: Linux / macOS / Windows いずれも CI で多 OS テスト済み。
- 依存:
serde,serde_json,rand,thiserror,clap。 副作用のない小さな依存だけで動く。 - 環境変数: 現状なし。 動作はすべてフラグで明示的に制御。
- 設定ファイル: 持たない。 鍵だけが設定であり秘密。
内部実装やワークスペース構成は 仕組みページを参照してください。
KEEP READING
CLI から、理論へ。
各フラグの裏で何が起きているか、もう一段踏み込みたいなら 理論ページへ。 アルゴリズムの擬似コードと実数値計算が読めます。