無料プライバシーツール

ブラウザでファイルを暗号化

ファイルを選び、パスフレーズを決めて、暗号化されたコピーをダウンロード。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で復号する——ために技術読者に必要なもの、すべて:

bytesfieldcontents
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の中の鍵、そして一覧も数も保存されない秘密の金庫。

App Storeでダウンロード

iPhoneとiPad · iOS 17+ · 無料