musubi

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.jsonmusubi 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-cli

C. ソースからクローンしてビルド

挙動を覗きたい・パッチを当てたいときはこちら。

musubi — bash

git clone git@github.com:masaki-09/musubi.gitcd musubicargo 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>u64PRNG をシード値で固定し、再現可能な鍵を生成。 デバッグ・テスト用。 本番では絶対に使わないこと。

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>必須PATHmusubi keygen で作った鍵ファイル。
-i, --input <FILE>PATH平文入力。省略時は stdin。
-o, --output <FILE>PATH暗号文 JSON の出力先。省略時は stdout。
-a, --anchor <POS>usizen / 2アンカー位置(0 始まり)。指定しなければ平文長の中央。
--compactflag整形しない 1 行 JSON を出力。シェルで取り回しやすい。
--strategy <S>canonical | chaincanonicalエンコーダ戦略。 canonical は v0.1 互換の隣接参照、 chain は v0.2 の多重結び(ランダム木)。
--noise <N>usize0平文に含まれないダミー文字を N 個織り込む(迷い糸)。 自動的に chain モードへ。 平文長そのものが見えなくなる。
--seed <U64>u64chain / 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.txtdiff 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,...}# もう一度同じシードで実行 → バイト単位で同じ JSONecho "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.keymusubi 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.keyecho "あいしてる" | 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.keyecho "あいしてる" | musubi encrypt -k my.key -o love.jsonmusubi 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.txtmusubi encrypt -k my.key -i plain.txt -o love.jsonmusubi 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 から、理論へ。

各フラグの裏で何が起きているか、もう一段踏み込みたいなら 理論ページへ。 アルゴリズムの擬似コードと実数値計算が読めます。