Manual / 使い方
HYBRID·VAULT は、ブラウザ内で完結するハイブリッド暗号化ツールです。
任意のファイルを 受信者の公開鍵 で封じ、受信者の秘密鍵 でのみ開封できる .hvault 形式に変換します。
オプションで 送信者の署名 を付与し、改ざんと送信者の真正性も検証できます。
すべての暗号処理はブラウザの Web Crypto API 上で実行され、 ファイルや鍵がサーバーに送信されることは一切ありません。
「ハイブリッド暗号」は RSA (公開鍵暗号) と AES (共通鍵暗号) を組み合わせる方式です。 AES は高速だが事前に鍵の共有が必要で、RSA は鍵共有不要だが大きなデータを直接暗号化するのは遅すぎます。 そのため 「ファイル本体は AES で速く暗号化し、AES 鍵だけを RSA で安全に封じる」 方式が一般的です。
| 役割 | 所有者 | アルゴリズム | 用途 |
|---|---|---|---|
| 受信者 公開鍵 | 受信者 (Bob) | RSA-OAEP | 送信者が AES 鍵を封じる |
| 受信者 秘密鍵 | 受信者 (Bob) | RSA-OAEP | 受信者が AES 鍵を取り出す |
| 送信者 秘密鍵 | 送信者 (Alice) | RSA-PSS | 送信者が署名を付ける |
| 送信者 公開鍵 | 送信者 (Alice) | RSA-PSS | 受信者が署名を検証する |
鍵ペアは OpenSSL コマンドラインで作成します。 macOS / Linux は標準搭載、Windows は Git for Windows 同梱の Git Bash で実行できます。
受信したい人 (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
bob-private.pem は Bob 自身が保持。絶対に他人に渡さないbob-public.pem は Alice (送信者) に事前に渡す
送信する人 (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
alice-sign-private.pem は Alice 自身が保持。絶対に他人に渡さないalice-sign-public.pem は Bob (受信者) に事前に渡す# 秘密鍵の中身 (RSA-2048 が表示されれば OK)
openssl pkey -in bob-private.pem -text -noout | head
# 公開鍵の中身
openssl pkey -in bob-public.pem -pubin -text -noout | head
-----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 のローカルディスクだけに置いてください。
最初に 1 度だけ 公開鍵を相手に渡す 必要があります。 公開鍵は名前のとおり公開しても安全な情報ですが、「正しい人の鍵である」ことを別経路で確認 してください (中間者攻撃で偽の公開鍵に差し替えられないようにするため)。
*-public.pem をやり取りする# SHA-256 指紋の確認 (両者で同じ値になるはず)
openssl dgst -sha256 bob-public.pem
送信者 (Alice) がトップ画面の ENCRYPT タブで操作します。
report.pdf) を選択。bob-public.pem) を選択。alice-sign-private.pem) を選択。report.pdf.hvault がダウンロードされる。
生成された .hvault ファイルを、メール / クラウドストレージ / USB 等で受信者に渡します。
このファイルは盗聴されても受信者の秘密鍵が無ければ復号できません。
受信者 (Bob) がトップ画面の DECRYPT タブで操作します。
.hvault が署名付きなら ON、未署名なら OFF。形式が一致しないと拒否される。.hvault ファイルを選択。bob-private.pem) を選択。alice-sign-public.pem) を選択。report.pdf) でダウンロードされる。
DECRYPT タブの Unseal & Download の直下にある
Extract AES key only (.hvkey) ボタンで、
.hvault の中の RSA で封じられたままの AES 鍵 だけをファイルとして取り出せます。
.hvault ファイルだけ。受信者秘密鍵は不要<元の名前>.hvkey (例: report.pdf.hvault → report.pdf.hvkey).hvkey だけを別経路で安全な場所にバックアップ.hvault から鍵を取り出し、別受信者向けに RSA で再 wrap (将来拡張).hvkey は単独では暗号文の本体 (.hvault) を復号できません。
本体を復号するには通常通り .hvault + 受信者秘密鍵を使います。
.hvkey はあくまで 「鍵成分の論理分離」 のための副産物で、
フォーマットは生バイト列 (256 byte の RSA-OAEP 出力) です。
双方向にやり取りする場合は、それぞれの役割で鍵ペアを 2 種類持つことになります。
| 誰が | 何を作成 | 誰に渡す |
|---|---|---|
| Alice | alice-private.pem / alice-public.pem (受信用) | alice-public.pem を Bob へ |
| Alice | alice-sign-private.pem / alice-sign-public.pem (署名用) | alice-sign-public.pem を Bob へ |
| Bob | bob-private.pem / bob-public.pem (受信用) | bob-public.pem を Alice へ |
| Bob | bob-sign-private.pem / bob-sign-public.pem (署名用) | bob-sign-public.pem を Alice へ |
| 操作 | 使う鍵 |
|---|---|
| Alice が ENCRYPT |
Recipient public key = bob-public.pemSender private key = alice-sign-private.pem
|
| Bob が DECRYPT |
Private key = bob-private.pemSender public key = alice-sign-public.pem
|
役割が逆になるだけです。Bob は Alice の公開鍵で封じ、自分の署名鍵で署名する。
| メッセージ | 原因 | 対処 |
|---|---|---|
| 鍵が違うか、ファイルが破損しています | 受信者秘密鍵が違う / 暗号化済み 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 形式で再生成してもらう |
リトルエンディアンのバイナリレイアウト。先頭から順に格納されます。
| オフセット | サイズ | 内容 |
|---|---|---|
0 | 4 byte | マジックナンバー "HVLT" |
4 | 2 byte | フォーマットバージョン (現在 2) |
6 | 2 byte | メタデータ JSON 長 M |
8 | 2 byte | 暗号化 AES 鍵長 K (RSA-2048 → 256) |
10 | 12 byte | AES-GCM IV |
22 | M byte | AES で暗号化されたメタデータ JSON |
22+M | K byte | RSA-OAEP で暗号化された AES 鍵 |
22+M+K | 残り | AES-GCM で暗号化された本体 (+ GCM tag 末尾 16 byte) |
v2 (署名版) ではさらに送信者公開鍵フィンガープリントと RSA-PSS 署名がヘッダ末尾に格納されます。
詳細は src/crypto/format.js を参照してください。