Công cụ riêng tư miễn phí

Mã hóa tệp trong trình duyệt của bạn

Chọn một tệp, chọn một cụm mật khẩu, rồi tải về bản mã hóa. AES-256-GCM, với khóa được dẫn xuất trong trình duyệt của bạn. Không gì tải lên, và nó hoạt động ngoại tuyến sau khi tải trang. Định dạng được ghi chép từng byte bên dưới, để bạn không phải tin lời chúng tôi về bất cứ điều gì.

Chạy hoàn toàn trong tab này. Không gì được tải lên, và nó hoạt động ngoại tuyến sau khi tải trang.

Tệp gì cũng được. Tệp lớn cần bộ nhớ. Xem phần giới hạn trung thực bên dưới.

Không có cách khôi phục. Quên cụm mật khẩu nghĩa là một tệp mà không ai, kể cả chúng tôi, có thể mở được nữa.

Mọi tham số, nêu rõ

Thuật toán mã hóa
AES-256-GCM (WebCrypto), tag 128-bit
Dẫn xuất khóa
PBKDF2-HMAC-SHA-256, 600,000 vòng lặp
Salt của KDF
16 byte, CSPRNG, mới cho từng tệp
Nonce GCM
12 byte, CSPRNG, mới cho từng tệp
Dữ liệu được xác thực
toàn bộ 42 byte phần đầu, nên can thiệp vào bất kỳ tham số nào đã nêu sẽ phá hỏng việc giải mã
Bảng mã cụm mật khẩu
UTF-8, chuẩn hóa NFC (để cùng một cụm gõ trên bất kỳ thiết bị nào dẫn xuất ra cùng một khóa)

Giới hạn trung thực

Đây không phải định dạng két sắt của ứng dụng Sealby. Ứng dụng dẫn xuất khóa bằng Argon2id hiệu chỉnh theo từng thiết bị, bọc khóa trong Secure Enclave, và lưu nội dung trong các container chia khối có khả năng phủ nhận. Một trang web không làm được điều nào trong số đó. Trang này là một tiện ích độc lập xây trên những gì trình duyệt cung cấp sẵn.

PBKDF2 không ngốn bộ nhớ. Đó là hàm dẫn xuất khóa duy nhất trình duyệt có sẵn, và 600,000 vòng lặp khiến mỗi lần đoán chậm đi, nhưng một dàn GPU vẫn tấn công nó nhanh hơn nhiều so với Argon2id. Vì vậy sự bảo vệ nằm ở cụm mật khẩu của bạn: từ bốn từ ngẫu nhiên trở lên, không phải một mật khẩu.

WebCrypto mã hóa trong một lượt. Không có streaming, nên toàn bộ tệp nằm trong bộ nhớ gấp hai đến ba lần trong lúc xử lý. Vài trăm megabyte thì ổn trên đa số thiết bị. Với các kho lưu nhiều gigabyte, hãy dùng công cụ trên máy tính. Bản mã hóa đầu ra cũng để lộ kích thước xấp xỉ của tệp. Tên tệp được mã hóa bên trong, nhưng kích thước thì không được che.

Định dạng, từng byte một

Mọi thứ một độc giả kỹ thuật cần để tự xác minh đầu ra của trang này một cách độc lập, hoặc giải mã nó bằng hai mươi dòng Python:

bytesfieldcontents
0–7magicASCII "SBXF0001"
8version0x01
9algorithm0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256
10–13iterationsuint32, big-endian (600,000)
14–29salt16 byte
30–41nonce12 byte
42–hếtciphertextAES-256-GCM của phần payload, AAD = byte 0–41; 16 byte cuối là tag GCM

Payload trước khi mã hóa: [2 byte độ dài tên, big-endian][tên tệp, UTF-8][các byte của tệp]. Tên tệp gốc đi kèm ở dạng đã mã hóa; khi giải mã nó được khôi phục.

Trình giải mã tham chiếu (Python, thư viện 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)

Đây là bản demo. Két sắt mới là sản phẩm.

Một tệp, một cụm mật khẩu, một trang. Đó là những gì một trình duyệt làm được. Sealby làm điều đó một cách trọn vẹn: Argon2id hiệu chỉnh cho thiết bị của bạn, khóa trong Secure Enclave, và những két sắt ẩn không lưu danh sách hay số đếm nào.

Tải trên App Store

iPhone & iPad · iOS 17+ · Miễn phí