無料プライバシーツール
ブラウザでファイルを暗号化
ファイルを選び、パスフレーズを決めて、暗号化されたコピーをダウンロード。AES-256-GCMで、鍵はブラウザの中で導出されます。何もアップロードされず、一度読み込めばオフラインでも動作します。フォーマットは下でバイト単位まで文書化してあるので、私たちの言葉を鵜呑みにする必要はありません。
このタブ内だけで完結。アップロードなし、読み込み後はオフラインでも動作。
どんなファイルでも。大きなファイルにはメモリが必要です。下の「正直な限界」をご覧ください。
リカバリーはありません。パスフレーズを忘れたら、誰にも——私たちにも——二度と開けないファイルになります。
すべてのパラメータを明示
- 暗号
- AES-256-GCM(WebCrypto)、128ビットタグ
- 鍵導出
- PBKDF2-HMAC-SHA-256、600,000回反復
- KDFソルト
- 16バイト、CSPRNG、ファイルごとに新規生成
- GCMノンス
- 12バイト、CSPRNG、ファイルごとに新規生成
- 認証付きデータ
- 42バイトのヘッダ全体。明示されたパラメータのどれかを改ざんすると、復号は失敗します
- パスフレーズのエンコーディング
- UTF-8、NFC正規化(どの端末で入力しても、同じフレーズから同じ鍵が導出されます)
正直な限界
これはSealbyアプリの金庫フォーマットではありません。アプリは端末ごとに調整したArgon2idで鍵を導出し、Secure Enclaveでラップし、コンテンツを否認可能なチャンク化コンテナに保存します。どれもウェブページにはできないことです。このページは、ブラウザが標準で提供するものの上に作られた、独立のユーティリティです。
PBKDF2はメモリハードではありません。ブラウザが標準搭載する唯一の鍵導出関数であり、600,000回の反復は推測1回を遅くします。それでもGPUリグは、Argon2idよりはるかに速く攻撃できます。だから保護は、あなたのパスフレーズにかかっています:パスワードではなく、ランダムな4語以上を。
WebCryptoの暗号化は一括処理です。ストリーミングはなく、処理中はファイル全体がメモリに2〜3倍分載ります。数百メガバイトなら、ほとんどの端末で問題ありません。数ギガバイトのアーカイブには、デスクトップのツールを。また、暗号化した出力からはファイルのおおよそのサイズがわかります。名前は中で暗号化されますが、サイズは隠れません。
フォーマット、バイト単位で
このページの出力を独立に検証する——あるいは20行のPythonで復号する——ために技術読者に必要なもの、すべて:
| bytes | field | contents |
|---|---|---|
| 0–7 | マジック | ASCII "SBXF0001" |
| 8 | バージョン | 0x01 |
| 9 | アルゴリズム | 0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256 |
| 10–13 | 反復回数 | uint32、ビッグエンディアン(600,000) |
| 14–29 | ソルト | 16バイト |
| 30–41 | ノンス | 12バイト |
| 42–末尾 | 暗号文 | ペイロードのAES-256-GCM、AAD = バイト0–41。末尾の16バイトがGCMタグ |
暗号化前のペイロード:[2バイトの名前長、ビッグエンディアン][ファイル名、UTF-8][ファイル本体]。元のファイル名は暗号化されて運ばれ、復号時に復元されます。
リファレンス復号器(Python、cryptographyライブラリ)
import sys, hashlib, struct, unicodedata
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SBXF0001" and raw[8] == 1 and raw[9] == 1
iters = struct.unpack(">I", raw[10:14])[0] # 600000
salt, nonce, ct = raw[14:30], raw[30:42], raw[42:]
phrase = unicodedata.normalize("NFC", sys.argv[2]).encode()
key = hashlib.pbkdf2_hmac("sha256", phrase, salt, iters, 32)
plain = AESGCM(key).decrypt(nonce, ct, raw[:42]) # AAD = header
name_len = struct.unpack(">H", plain[:2])[0]
name = plain[2 : 2 + name_len].decode()
open(name, "wb").write(plain[2 + name_len :])
print("decrypted ->", name)これはデモです。金庫が製品です。
1つのファイル、1つのパスフレーズ、1つのページ。ここまでがブラウザにできること。Sealbyは本式にやります:端末に合わせて調整したArgon2id、Secure Enclaveの中の鍵、そして一覧も数も保存されない秘密の金庫。
iPhoneとiPad · iOS 17+ · 無料