Book Code Builder

「page:line:word」形式の書籍暗号(Book Code)を体験する教育用ツール

1) 鍵生成(コードブック設定)

2) 暗号化

プリセット:

3) 復号

4) コードブック・ビューワー

ヘルプ

📖 書籍暗号の基本

書籍暗号(Book Code)は、任意のテキスト(歴史的には書籍)を鍵として使用する暗号方式です。

平文に登場する各単語を、コードブック(鍵となるテキスト)に登場する単語の位置に対応させることで暗号化します。

位置は「ページ数・行数・何番目」の3つの数字で表現され、本ツールでは page:line:word の形式(例:12:5:3 = 12ページ目の5行目の3語目)を採用しています。

  • 暗号化: 平文の各単語 → コードブック内の座標 p:l:w に変換
  • 復号: 座標 p:l:w → コードブックから単語を逆引き

⚠️ 注意: 本ツールは教育・研究目的です。実運用の暗号としては推奨しません。

⚙️ 仕組みと動作原理

インデックス構築

コードブックのテキストは以下のように処理されます:

  1. 行分割: 改行文字で行に分割(空行も1行として扱われる)
  2. ページ分割: 「ページあたりの行数」(デフォルト40行)で自動的にページ分割
  3. 単語抽出: Unicode対応の正規表現で単語を抽出(ハイフンやアポストロフィを含む単語にも対応)
  4. インデックス作成: 各単語の全出現位置を記録

暗号化プロセス

平文の各単語をインデックスで検索し、対応する p:l:w 座標に変換します。

  • コードブックに存在しない単語は {???} で出力
  • 同じ単語が複数回出現する場合はラウンドロビン方式で異なる座標を順番に使用(設定でON/OFF可能)

復号プロセス

p:l:w 形式の座標を解析し、コードブックから該当する単語を取得します。

  • スペース・カンマ・セミコロン・改行で区切り入力可能
  • 不正なトークンや範囲外の座標は [?] で出力

📌 ラウンドロビン割当とは?

同じ単語がコードブック内に複数回出現する場合、毎回異なる座標を順番に割り当てる方式です。

例: 「wolf」が3箇所 (1:5:2, 2:3:1, 3:1:4) に出現する場合

  • ON(推奨): 1回目→1:5:2、2回目→2:3:1、3回目→3:1:4、4回目→1:5:2(最初に戻る)
  • OFF: すべて 1:5:2(常に最初の座標)

ラウンドロビンONにすると、同じ単語でも暗号文では異なる座標になり、頻度分析攻撃への耐性が向上します。

🕰️ 歴史的背景

書籍暗号は19〜20世紀のスパイ活動・外交・戦時通信で広く使用されました。

なぜ重要だったのか

  • 入手容易性: 書籍・新聞・聖書など「誰でも入手できるテキスト」を鍵として利用
  • 秘匿性: 鍵(書籍)を持っていても、それが暗号の鍵だと気づかれにくい
  • 可変性: 異なる書籍を使えば、毎回異なる暗号システムになる

実運用での課題

  • 版の違い: 改訂版・誤植・句読点の差異が致命的なエラー源
  • 語彙の制限: コードブックに含まれない単語は暗号化できない
  • 頻度分析: 同じ単語が常に同じ座標になると統計的攻撃に脆弱
  • 運用管理: 同一版の配布・更新手順が重要

💡 実際の「ブックコード破り(book code breaking)」は情報戦の一分野として研究されていました。

🚀 本ツールの使い方

基本操作

  1. コードブックの設定:
    • コードブックプリセットボタンから選択(推奨)
    • または、任意のテキストを「Reference Text」欄に貼り付け
  2. 設定調整: 「ページあたりの行数」や正規化オプションを調整(必要に応じて)
  3. インデックス構築: 「インデックス構築」ボタンをクリック
  4. 暗号化:
    • 「暗号化」タブで平文を入力
    • 「暗号化」ボタンをクリック → p:l:w 形式の暗号文が生成
    • 「📋 コピー」ボタンで暗号文をクリップボードにコピー可能
  5. 復号:
    • 「復号」タブで p:l:w 形式の暗号文を入力
    • 「↓ 同期」ボタンで暗号化タブの暗号文を自動読込可能
    • 「復号」ボタンをクリック → 平文が復元
  6. ビューワー:
    • 「ビューワー」タブでコードブックの内容を確認
    • 単語をクリックすると、その単語の全出現座標を表示
    • ページ送り・戻しボタンでナビゲーション可能

ショートカットキー

  • Enter: インデックス構築、ビューワー表示
  • Ctrl+Enter / Cmd+Enter: 暗号化、復号

コードブックプリセットの追加方法

  1. data/ フォルダーに .txt ファイルを配置
  2. data/manifest.json にファイル情報を追加
  3. ページをリロードすると自動的にプリセットボタンが表示

詳細は data/README.md を参照してください。

🔧 技術仕様

ページ分割と行の扱い

  • 改行による行分割: \n または \r\n で行に分割
  • ページ分割: 「ページあたりの行数」(デフォルト40行)で論理的にページ分割
  • 行の構造: 1行あたりの単語数に制限なし(可変長)

単語の抽出

Unicode対応の正規表現: /[\p{L}\p{N}]+(?:[-'''][\p{L}\p{N}]+)*/gu

認識される単語例:

  • 英数字:hello, abc123
  • ハイフン付き:co-operate
  • アポストロフィ付き:don't, it's

正規化オプション

  • 大文字・小文字を無視: すべて小文字に統一(デフォルトON)
  • Unicode正規化(NFKC): 全角半角の差異を統一(デフォルトON)

⚠️ これらの設定は暗号化・復号の両方で同じ設定を使う必要があります。

制限事項

  • コードブックに存在しない単語は暗号化できません
  • 完全なワンタイムパッドではないため、十分な長さと語彙の多様性が重要
  • 同じコードブックを繰り返し使うと統計的攻撃に脆弱になります
  • ラウンドロビンOFFの場合、頻度分析攻撃に極めて脆弱です
  • 大きなファイル(5MB以上)はブラウザーのパフォーマンスに影響する可能性があります