Бесплатный инструмент приватности

Зашифруйте файл в браузере

Выберите файл, задайте парольную фразу и скачайте зашифрованную копию. AES-256-GCM, с ключом, выведенным в вашем браузере. Ничего не загружается на сервер, а после загрузки страницы всё работает офлайн. Формат описан ниже байт за байтом, так что верить нам на слово не нужно ни в чём.

Работает целиком в этой вкладке. Ничего не загружается, после загрузки работает офлайн.

Любой файл. Большим файлам нужна память. См. честные ограничения ниже.

Восстановления не существует. Забытая парольная фраза означает файл, который никто, включая нас, уже никогда не откроет.

Каждый параметр — названный

Шифр
AES-256-GCM (WebCrypto), 128-битный тег
Вывод ключа
PBKDF2-HMAC-SHA-256, 600 000 итераций
Соль KDF
16 байт, CSPRNG, новая для каждого файла
Nonce GCM
12 байт, CSPRNG, новый для каждого файла
Аутентифицируемые данные
весь 42-байтный заголовок, поэтому подмена любого заявленного параметра ломает расшифровку
Кодировка парольной фразы
UTF-8, нормализация NFC (чтобы одна и та же фраза, набранная на любом устройстве, давала один и тот же ключ)

Честные ограничения

Это не формат сейфа приложения Sealby. Приложение выводит ключи через Argon2id, откалиброванный под каждое устройство, заворачивает их в Secure Enclave и хранит содержимое в отрицаемых контейнерах, разбитых на блоки. Ничего из этого веб-страница не может. Эта страница — самостоятельная утилита, построенная на том, что браузеры дают штатно.

PBKDF2 не требователен к памяти. Это единственная функция вывода ключа, встроенная в браузеры, и 600 000 итераций делают каждую догадку медленной, но GPU-установка всё равно атакует его гораздо быстрее, чем Argon2id. Поэтому защита живёт в вашей парольной фразе: четыре случайных слова или больше, а не пароль.

WebCrypto шифрует за один заход. Потоковой обработки нет, поэтому во время работы весь файл лежит в памяти в двух-трёх копиях. Сотни мегабайт на большинстве устройств нормально. Для многогигабайтных архивов используйте настольный инструмент. Зашифрованный результат к тому же раскрывает примерный размер файла. Имя зашифровано внутри, но размер не скрыт.

Формат, байт за байтом

Всё, что нужно техническому читателю, чтобы независимо проверить вывод этой страницы или расшифровать его двадцатью строками на Python:

bytesfieldcontents
0–7magicASCII "SBXF0001"
8версия0x01
9алгоритм0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256
10–13итерацииuint32, big-endian (600 000)
14–29соль16 байт
30–41nonce12 байт
42–конецшифротекстAES-256-GCM полезной нагрузки, AAD = байты 0–41; последние 16 байт — тег GCM

Полезная нагрузка до шифрования: [длина имени, 2 байта, big-endian][имя файла, 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)

Это демонстрация. Продукт — сейф.

Один файл, одна парольная фраза, одна страница. Вот что может браузер. Sealby делает это как следует: Argon2id, откалиброванный под ваше устройство, ключи в Secure Enclave и скрытые сейфы, список и число которых нигде не хранятся.

Скачать в App Store

iPhone и iPad · iOS 17+ · Бесплатно