無料プライバシーツール

ファイルを封印

一度きりの新しい鍵でファイルを暗号化して、好きな経路で送りましょう。鍵を持つ人は、ほかでもないこのページでそれを開きます。アップロードは一度もなく、解読すべきパスフレーズもなく、中身は何かが保存される前に確認できます。

このタブ内だけで完結。このページは、そもそもどのサーバーとも通信できません。

すべてのパラメータを明示

暗号
AES-256-GCM(WebCrypto)、チャンクごとに128ビットタグ
ブラウザのCSPRNGによる256ビット。封印ごとに新規生成、一度きりの使用、何からも導出しない
チャンク化
暗号化されたマニフェスト(ファイル名、サイズ、種類)に続いて、ファイルを1MiBのチャンクに分割——それぞれ個別に認証
ノンス
32ビットのランダムな封印ソルト ‖ 64ビットのチャンクカウンター——同一ファイル内で決して繰り返されず、そもそも鍵は一度きり
認証付きデータ
16バイトのヘッダ全体に加えて、各チャンクのインデックスとチャンク総数——チャンクの並べ替え、切り詰め、差し込みは復号を壊します
鍵の文字列
base64url、47文字:32バイトの鍵に3バイトのSHA-256チェックサムを付けたもの。タイプミスはゴミを生む代わりに、きれいに失敗します

これが何をするのか、正直にお答えします

すべては、あなたのブラウザの中で起きます。

封印も開封も、ファイルをこのページのメモリに読み込み、そこでブラウザ標準搭載のWebCryptoエンジンによってAES-256-GCMを実行し、結果をダウンロードとして返します。アップロードはありません。アカウントもサーバー側の処理もありません。このサイトのほかのページと違って、このページはCookieなしの訪問カウンターすら読み込みません。いかなる分析もありません。

これは単なる約束ではありません。このページはContent-Security-Policyとともに配信されており、ブラウザに許されるのは、このサイト自身の静的ファイルの取得だけです。あなたのファイルも、鍵も、そのほかの何も、私たちのものを含むどのサーバーにも送りようがありません。封印しながらブラウザの開発者ツールを開けば、リクエストがゼロであることが見えるはずです。もっとも率直な証明が欲しければ、ツールボックスをインストールして、機内モードで封印してください。ネットワークを切っていれば、何も出ていけません。

鍵がすべて——そして私たちは、それを決して持ちません。

封印のたびに、新しいランダムな256ビット鍵がブラウザ内で生成されます。それは一度だけあなたに示され、どこにも保管されません:私たちのシステムにも(そもそも関与していません)、ブラウザのストレージにも、封印ファイルの中にも。推測すべきパスフレーズはなく、総当たりできるものもありません。鍵とファイルを持つ人は、開けられます。持たない人は、開けられません。

これには、厳しい帰結があります:鍵を失えば、ファイルも失われます。リセットも、サポートへの問い合わせも、復旧もありません。意地悪をしているのではありません。私たちが復旧できるコピーとは、誰かが盗んだり、要求したりできるコピーのことだからです。

鍵のリンクが、サーバーに届くことはありません。

共有リンクは、鍵をURLの#より後ろに置きます。その部分——フラグメント——は、ブラウザが手元に保ちます。ブラウザがどのサーバーへ送る内容にも、それが含まれることはありません。私たちのサーバーにも、ほかの誰のサーバーにもです。このページが鍵つきのリンクで読み込まれると、ページは鍵を読み取り、「開封」タブに切り替え、ただちにアドレスバーから鍵を削除します。目に見えるURLやブラウザの履歴に残らないようにするためです。

それでも、リンクと封印ファイルの両方を持つ人は、誰でもそれを開けます。だからこのページは、ファイルと鍵を別々の経路で送るようお伝えするのです。

何かが保存される前に、中身が見えます。

開封は、二段構えで進みます。まずページは、小さなマニフェスト——元のファイル名、サイズ、種類——だけを復号します。そしてそれを、あなたに示します。コードを実行しうるファイル形式(プログラム、スクリプト、インストーラ、マクロ入り文書、HTML)や、invoice.pdf.exeのような二重拡張子で偽装された名前には、大きな警告を添えて。あなたが復号をクリックするまで、何も書き込まれません。ページ自身が、復号された中身を開いたり表示したりすることは決してありません。ファイルをダウンロードとして差し出すだけです。

暗号化が何を証明し、何を証明しないかは、はっきりさせておきましょう。封印ファイルは、転送中は秘密に保たれます。しかし封印されていることは、誰が送ったかについても、中身が安全かどうかについても、何も語りません。心当たりのない封印ファイルは、心当たりのない添付ファイルとまったく同じ懐疑をもって扱ってください。

信頼の境界が、本当はどこにあるか。

あなたはいま、このウェブサイトがあなたに配信したコードを実行しています。sealby.appか、そこへの接続が侵害されていれば、悪意あるページはあなたが入力したものを読み取れてしまいます。これはウェブベースの暗号化ツールすべてに言えることで、私たちは違うふりをするより、そう言うほうを選びます。私たちの対策はこうです。このページは静的ファイルで、そこにサードパーティのコードを入れません。インストール版のツールボックスなら、すでに読み込んだバージョンを使い続けられます。そしてフォーマットは下で文書化してあるので、それに合わせて独立したツールを作れます。

あなた自身の端末も、境界の内側です。ページへのアクセス権を持つブラウザ拡張機能や、そのマシン上のマルウェアは、どのページにも読めるものはすべて読めます。封印ファイル自身は、中身を隠します。ただし、すべてを隠すわけではありません。それを持つ人には、そのサイズ(元のファイルとほぼ同じ)と、それがSealbyで封印されたファイルであることが見えます。

限界を、平たい言葉で

  • 鍵を失う = ファイルを失う。設計上、例外はありません。
  • 私たちにはあなたのファイルも鍵も見えないので、マルウェアのスキャンもできません。ファイル形式の警告は、ファイル名だけに基づくものです。安全の保証ではありません。
  • 封印ファイルと鍵の両方を持つ人は、誰でもそれを開けます。このツールは、その人が誰かを知りませんし、確かめもしません。
  • 封印ファイルのサイズは、元のファイルのおおよそのサイズを明かします。
  • 1回の封印につき、ファイル1つ、100MBまで。複数のファイルは、先にzipにまとめてください。

フォーマット、バイト単位で

このページの出力を独立に検証する——あるいは.sealedファイルを30行のPythonで開く——ために技術読者に必要なもの、すべて:

bytesfieldcontents
0–7マジックASCII "SEALBY-W"
8バージョン0x01——それ以外は「より新しいバージョンで作られた」として拒否
9アルゴリズム0x01 = AES-256-GCM
10–13封印ソルト4バイト、CSPRNG、封印ごとに新規生成
14–15予約ゼロでなければならない
16–末尾チャンクフレーム各フレーム:uint32 BEの暗号文長、続いてAES-GCM暗号文 + 16バイトタグ

チャンク0はマニフェストです:UTF-8のJSON {"name":…,"size":…,"type":…}。チャンク1…N−1が、1MiBずつに分けたファイル本体です。N個中i番目のチャンクについて:ノンス = ソルト ‖ uint64 BEのi、認証付きデータ = ヘッダ ‖ uint64 BEのi ‖ uint64 BEのN。したがって改ざん、切り詰め、並べ替え、位置の入れ替え、ファイルをまたぐ差し込みは、すべて認証に失敗します。そのひとつひとつが、コミット済みのネガティブテストで実証されています。

鍵の文字列:32バイトの鍵に、そのSHA-256の先頭3バイトを続けたもののbase64url(パディングなし)。全部で47文字です。タイプミスはゴミを生む代わりに、チェックサムで失敗します。

リファレンス開封器(Python、cryptographyライブラリ)
import base64, hashlib, json, struct, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SEALBY-W" and raw[8] == 1 and raw[9] == 1
assert raw[14:16] == b"\x00\x00"
header, salt = raw[:16], raw[10:14]
frames, off = [], 16
while off < len(raw):
    (n,) = struct.unpack(">I", raw[off:off + 4]); off += 4
    frames.append(raw[off:off + n]); off += n
assert off == len(raw)

kb = base64.urlsafe_b64decode(sys.argv[2] + "=")   # 47-char key string
key, check = kb[:32], kb[32:35]
assert hashlib.sha256(key).digest()[:3] == check    # typo check

N = len(frames)
def chunk(i):
    nonce = salt + struct.pack(">Q", i)
    aad = header + struct.pack(">QQ", i, N)
    return AESGCM(key).decrypt(nonce, frames[i], aad)

manifest = json.loads(chunk(0))
data = b"".join(chunk(i) for i in range(1, N))
assert len(data) == manifest["size"]
open(manifest["name"], "wb").write(data)
print("decrypted ->", manifest["name"])

これは移動中のファイルのため。金庫は、留まるファイルのため。

封印は、どこかへ向かう途中のファイルを守ります。Sealbyは、留まるすべてを守ります:写真、ファイル、メモをiPhoneの暗号化金庫に。アカウントなし、サーバーなし、あなた以外の誰にも読めません。

App Storeでダウンロード

iPhoneとiPad · iOS 17+ · 無料