HYBRID·VAULT

Manual / 使い方

← Terminal

01 このツールについて

HYBRID·VAULT は、ブラウザ内で完結するハイブリッド暗号化ツールです。 任意のファイルを 受信者の公開鍵 で封じ、受信者の秘密鍵 でのみ開封できる .hvault 形式に変換します。 オプションで 送信者の署名 を付与し、改ざんと送信者の真正性も検証できます。

すべての暗号処理はブラウザの Web Crypto API 上で実行され、 ファイルや鍵がサーバーに送信されることは一切ありません。

02 仕組みと用語

「ハイブリッド暗号」は RSA (公開鍵暗号)AES (共通鍵暗号) を組み合わせる方式です。 AES は高速だが事前に鍵の共有が必要で、RSA は鍵共有不要だが大きなデータを直接暗号化するのは遅すぎます。 そのため 「ファイル本体は AES で速く暗号化し、AES 鍵だけを RSA で安全に封じる」 方式が一般的です。

ENCRYPT① ランダム AES 鍵を生成
② AES でファイル本体を暗号化
③ 受信者の RSA 公開鍵で AES 鍵を暗号化
④ (任意) 送信者の RSA-PSS 秘密鍵で全体に署名
⇒ .hvault に格納
DECRYPT① 受信者の RSA 秘密鍵で AES 鍵を復元
② AES 鍵でファイル本体を復号
③ (任意) 送信者の RSA 公開鍵で署名検証

登場する 4 種類の鍵

役割所有者アルゴリズム用途
受信者 公開鍵 受信者 (Bob) RSA-OAEP 送信者が AES 鍵を封じる
受信者 秘密鍵 受信者 (Bob) RSA-OAEP 受信者が AES 鍵を取り出す
送信者 秘密鍵 送信者 (Alice) RSA-PSS 送信者が署名を付ける
送信者 公開鍵 送信者 (Alice) RSA-PSS 受信者が署名を検証する
POINT: ファイル形式は同じ PEM (PKCS#8 / SPKI) ですが、 受信者鍵は暗号化用、送信者鍵は署名用 で別物です。混同しないため別々に作ることを推奨します。

03 キーペアの作成方法

鍵ペアは OpenSSL コマンドラインで作成します。 macOS / Linux は標準搭載、Windows は Git for Windows 同梱の Git Bash で実行できます。

① 受信者の鍵ペア (RSA-OAEP / 復号用)

受信したい人 (Bob) が自分の PC で 1 度だけ実行します。

# Bob の秘密鍵 (PKCS#8 / 2048bit RSA) を生成
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
  -out bob-private.pem

# Bob の公開鍵 (SPKI) を秘密鍵から導出
openssl pkey -in bob-private.pem -pubout \
  -out bob-public.pem

② 送信者の鍵ペア (RSA-PSS / 署名用) ※署名を使う場合のみ

送信する人 (Alice) が自分の PC で 1 度だけ実行します。 鍵フォーマットは ① と同じ PEM (PKCS#8 / SPKI) で、用途は importKey 時の指定で決まります。

# Alice の署名秘密鍵 (PKCS#8 / 2048bit RSA) を生成
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
  -out alice-sign-private.pem

# Alice の署名公開鍵 (SPKI) を秘密鍵から導出
openssl pkey -in alice-sign-private.pem -pubout \
  -out alice-sign-public.pem

③ 鍵が正しく生成できたかの確認

# 秘密鍵の中身 (RSA-2048 が表示されれば OK)
openssl pkey -in bob-private.pem -text -noout | head

# 公開鍵の中身
openssl pkey -in bob-public.pem -pubin -text -noout | head
注意: 本ツールが受け付ける PEM 形式は以下です:
  • 秘密鍵: -----BEGIN PRIVATE KEY----- (PKCS#8)
  • 公開鍵: -----BEGIN PUBLIC KEY----- (SPKI / X.509 SubjectPublicKeyInfo)
BEGIN RSA PRIVATE KEY (PKCS#1) で始まる旧形式の場合は、 openssl pkcs8 -topk8 -in old.pem -out new.pem -nocrypt で PKCS#8 に変換してください。
禁止: 生成した *.pem ファイルを Git にコミットしない。 メールや Slack に貼り付けない。第三者の PC や共有ストレージに置かない。 秘密鍵は本来の所有者の PC のローカルディスクだけに置いてください。

04 公開鍵の交換

最初に 1 度だけ 公開鍵を相手に渡す 必要があります。 公開鍵は名前のとおり公開しても安全な情報ですが、「正しい人の鍵である」ことを別経路で確認 してください (中間者攻撃で偽の公開鍵に差し替えられないようにするため)。

# SHA-256 指紋の確認 (両者で同じ値になるはず)
openssl dgst -sha256 bob-public.pem

05 暗号化 (ENCRYPT) の手順

送信者 (Alice) がトップ画面の ENCRYPT タブで操作します。

  1. 送信者署名トグル: 送信者の真正性を保証したい場合は ON のまま。署名なしで良ければ OFF。
  2. Plaintext file: 送りたい任意のファイル (例: report.pdf) を選択。
  3. Recipient public key: 受信者から事前に受け取った公開鍵 (例: bob-public.pem) を選択。
  4. Sender private key (署名 ON のときのみ): 自分の署名用秘密鍵 (例: alice-sign-private.pem) を選択。
  5. Seal & Download ボタンをクリック → report.pdf.hvault がダウンロードされる。

生成された .hvault ファイルを、メール / クラウドストレージ / USB 等で受信者に渡します。 このファイルは盗聴されても受信者の秘密鍵が無ければ復号できません。

06 復号 (DECRYPT) の手順

受信者 (Bob) がトップ画面の DECRYPT タブで操作します。

  1. 送信者署名トグル: 受け取った .hvault が署名付きなら ON、未署名なら OFF。形式が一致しないと拒否される。
  2. Encrypted vault (.hvault): 受信した .hvault ファイルを選択。
  3. Private key: 自分の復号用秘密鍵 (例: bob-private.pem) を選択。
  4. Sender public key (署名 ON のときのみ): 送信者から事前に受け取った署名検証用公開鍵 (例: alice-sign-public.pem) を選択。
  5. Unseal & Download ボタンをクリック → 元のファイル名 (例: report.pdf) でダウンロードされる。

AES 鍵だけを抽出する (Extract AES key only)

DECRYPT タブの Unseal & Download の直下にある Extract AES key only (.hvkey) ボタンで、 .hvault の中の RSA で封じられたままの AES 鍵 だけをファイルとして取り出せます。

用途:
  • 鍵エスクロー / バックアップ: .hvkey だけを別経路で安全な場所にバックアップ
  • マルチ受信者の準備: 同じ .hvault から鍵を取り出し、別受信者向けに RSA で再 wrap (将来拡張)
  • フォーマット監査 / デバッグ: RSA-OAEP 出力のバイトパターン確認
注意: .hvkey は単独では暗号文の本体 (.hvault) を復号できません。 本体を復号するには通常通り .hvault + 受信者秘密鍵を使います。 .hvkey はあくまで 「鍵成分の論理分離」 のための副産物で、 フォーマットは生バイト列 (256 byte の RSA-OAEP 出力) です。

07 典型シナリオ (Alice ↔ Bob)

双方向にやり取りする場合は、それぞれの役割で鍵ペアを 2 種類持つことになります。

初期セットアップ (1 回だけ)

誰が何を作成誰に渡す
Alicealice-private.pem / alice-public.pem (受信用)alice-public.pem を Bob へ
Alicealice-sign-private.pem / alice-sign-public.pem (署名用)alice-sign-public.pem を Bob へ
Bobbob-private.pem / bob-public.pem (受信用)bob-public.pem を Alice へ
Bobbob-sign-private.pem / bob-sign-public.pem (署名用)bob-sign-public.pem を Alice へ

Alice → Bob にファイルを送るとき

操作使う鍵
Alice が ENCRYPT Recipient public key = bob-public.pem
Sender private key = alice-sign-private.pem
Bob が DECRYPT Private key = bob-private.pem
Sender public key = alice-sign-public.pem

Bob → Alice に返信するとき

役割が逆になるだけです。Bob は Alice の公開鍵で封じ、自分の署名鍵で署名する。

08 エラーメッセージとトラブルシューティング

メッセージ原因対処
鍵が違うか、ファイルが破損しています 受信者秘密鍵が違う / 暗号化済み AES 鍵の改ざん / 本体の改ざん 正しい受信者秘密鍵を選択。送信者から再送してもらう
送信者の署名が一致しません。改ざんまたは送信者違いの可能性があります 送信者公開鍵が違う / .hvault が改ざんされた 正しい送信者公開鍵を選択。再送依頼。中間者攻撃の可能性も検討
受信者公開鍵の読み込みに失敗しました PEM 形式不正 / 秘密鍵を選んだ / SPKI でない -----BEGIN PUBLIC KEY----- で始まる PEM か確認
受信者秘密鍵の読み込みに失敗しました PEM 形式不正 / 公開鍵を選んだ / PKCS#8 でない -----BEGIN PRIVATE KEY----- で始まる PEM か確認。PKCS#1 形式なら PKCS#8 に変換
送信者秘密鍵の読み込みに失敗しました 署名秘密鍵の PEM 形式不正 受信者鍵と署名鍵を取り違えていないか確認
送信者公開鍵の読み込みに失敗しました 署名公開鍵の PEM 形式不正 同上。SPKI 形式の PEM か確認
このファイルは旧フォーマット (v1) のため復号できません 署名トグルの形式と .hvault の形式が不一致 v1 の .hvault は廃止済み。送信者に v2 形式で再生成してもらう

09 セキュリティ上の注意

非対象: 本ツールは 鍵管理 (鍵の安全な保管・配布・失効) は提供しません。 鍵ファイルの保管・バックアップ・破棄はユーザー自身の責任で行ってください。 秘密鍵を紛失すると暗号化済みファイルは 誰にも復号できなくなります

10 .hvault ファイル仕様

リトルエンディアンのバイナリレイアウト。先頭から順に格納されます。

オフセットサイズ内容
04 byteマジックナンバー "HVLT"
42 byteフォーマットバージョン (現在 2)
62 byteメタデータ JSON 長 M
82 byte暗号化 AES 鍵長 K (RSA-2048 → 256)
1012 byteAES-GCM IV
22M byteAES で暗号化されたメタデータ JSON
22+MK byteRSA-OAEP で暗号化された AES 鍵
22+M+K残りAES-GCM で暗号化された本体 (+ GCM tag 末尾 16 byte)

v2 (署名版) ではさらに送信者公開鍵フィンガープリントと RSA-PSS 署名がヘッダ末尾に格納されます。 詳細は src/crypto/format.js を参照してください。