AES-256-GCM in your browser. This page makes zero network requests — open it from anywhere, even a USB stick.
python3 -m http.server and open http://localhost:8000/offline.html.
Works with files of any size (4 MB encrypted pieces). Encrypting stores the original filename inside the container, encrypted; decrypting restores it. Both .dlenc generations (DLE1 and DLE2) are supported.
The complete Domainless Encrypt application in one self-contained HTML file, using only your browser's built-in Web Crypto engine. It exists so that anything you encrypted with domainless.fun/files/encrypt stays yours to decrypt forever — independent of the website, its server, or its operator. It never makes a network request.
The one thing that cannot work offline is one-time secret links (domainless.fun/files/encrypt/secret?id=…): their ciphertext lives on the server and burns after one read. Treat those as ephemeral by design.
+→-, /→_, no padding
DLE1 file / dlenc1: text (base64url of the same bytes behind "dlenc1:")
"DLE1"(4) | salt(16) | iv(12) | AES-256-GCM ciphertext+tag
key = PBKDF2-SHA256(passphrase, salt, 250000) -> 32 bytes
DLE2 file (chunked)
fixed header, 45 bytes:
"DLE2"(4) | version(1)=0x01 | iterations(4,BE) | salt(16) |
ivPrefix(8) | chunkSize(4,BE) | totalChunks(4,BE) | nameCtLen(4,BE)
then: nameCt (encrypted filename, absent if nameCtLen=0)
then: totalChunks chunks; each = AES-256-GCM(chunkSize plaintext bytes,
last chunk short; empty file = 1 empty chunk) + 16-byte tag
chunk i: IV = ivPrefix || uint32BE(i)
AAD = header(45 bytes) || uint32BE(i)
filename: IV/AAD as above with i = 0xFFFFFFFF; plaintext = UTF-8 name
key = PBKDF2-SHA256(passphrase, salt, iterations) -> 32 bytes
dlkey1: message (base64url behind "dlkey1:")
"DLK1"(4) | ephemeral public key, uncompressed P-256 point(65) |
iv(12) | AES-256-GCM ciphertext+tag
key = x-coordinate of ECDH(ephemeral priv, recipient pub) (32 bytes)
private keys travel as base64url PKCS#8; public keys as the raw 65-byte point
The full source (server, CLI tool, tests, this file's template) is published at
domainless.fun/files/encrypt/source with SHA-256 checksums, and mirrors may exist.
Any implementation that follows the layouts above will interoperate — nothing here is
secret except your passphrases and private keys.