Client-side encrypted PDF sharing, explained properly.
"End-to-end encrypted" gets used loosely. Here's the actual cryptographic mechanism behind a client-side encrypted PDF link — AES-256-GCM, key handling, fragment vs passphrase modes, and what the server literally cannot do. Note: "zero-knowledge" on this page refers to the server holding no information that could decrypt your file, not to formal zero-knowledge proofs (ZKPs) — the product does not use ZKPs.
What "zero-knowledge" means here
Quick disambiguation before anything else: this system does not use zero-knowledge proofs (ZKPs). The phrase "zero-knowledge" on this page refers to the weaker but practically useful property that the server storing your shared file has no knowledge — cryptographic or operational — that could be used to decrypt it. The key never touches the server, so the server cannot reveal it under any circumstance. Mechanism is plain client-side encryption plus a key that travels only in the URL fragment (or is derived from a passphrase the server never sees).
window.crypto.subtle. Verifiable in DevTools.How a client-side encrypted PDF link is built
A walkthrough of what the sender's browser, the server, and the recipient's browser each do — with the actual Web Crypto calls.
Fragment mode vs passphrase mode
Two ways to carry the key to the recipient. Same ciphertext guarantee, different usability / leakage trade-offs.
Key rides in the URL hash (#)
The simplest flow: copy the link, paste it into a chat to the recipient, done. The part of the URL after # is never sent to any web server by any compliant browser — that's what keeps the key private.
- One step for the recipient — click the link.
- Low friction, suitable for low-to-medium-sensitivity sharing.
- Risk: if the link leaks in a screenshot or browser sync, the file leaks with it.
- Use when you trust the channel (signed messenger, internal chat).
Key derived from a passphrase (PBKDF2)
The sender picks a passphrase. The browser derives a 256-bit key via PBKDF2-SHA256 with 310,000 iterations over a random 128-bit salt. The salt is stored server-side; the passphrase is shared out-of-band (phone, Signal, in-person).
- Two-factor share: the link and the passphrase travel separately.
- Link alone is not enough — the ciphertext stays unreadable.
- Passphrase strength matters: 310k iterations slow brute force but don't rescue a 6-character passphrase.
- Use when the link might be forwarded or stored somewhere you don't fully trust.
| Property | Fragment mode | Passphrase mode |
|---|---|---|
| Key carrier | URL hash (#) | Passphrase + salt |
| Server ever sees the key | No | No |
| Server stores | Ciphertext + IV | Ciphertext + IV + salt |
| Recipient friction | Click link | Click link + type passphrase |
| Leakable via screenshot | Yes (link = key) | No (link alone useless) |
| Brute-force resistant | 256-bit random | Depends on passphrase |
| Best for | Low-friction sharing over trusted channels | Higher-sensitivity sharing |
Why a server-stored ciphertext still protects you
People often ask: "if it's on your server, how is it private?" The answer is that ciphertext is not the file. Without the key, it's just random-looking bytes. Here's what that means in practice.
warningHonest limitations
Client-side encryption does not solve endpoint security. Malware on the sender's or recipient's device can steal the key from memory. A compromised browser extension can read the decrypted file. And a forwarded link in a group chat undoes every cryptographic guarantee. The architecture raises the cost of a breach; it does not eliminate all risk.
Client-side encryption vs other "secure" options
A clear comparison of common choices for sharing a PDF. Most options labeled "secure" are transport-encrypted — they protect the data in flight, but the receiving server still holds the plaintext and the key.
| Option | TLS in transit | Server can read file | Expiry | Recipient account |
|---|---|---|---|---|
| Email attachment | Usually yes | Yes — at every hop | Forever | Not required |
| Generic cloud share link | Yes | Yes | Optional | Sometimes |
| Password-protected PDF | Yes | Yes (if host has the file) | Never | Not required |
| PDF Pro (fragment mode) | Yes | No | 24h / 30d | Not required |
| PDF Pro (passphrase mode) | Yes | No | 24h / 30d | Not required |
Related reading
Frequently asked questions
What does client-side encrypted PDF sharing actually mean?
What encryption does PDF Pro use for client-side encrypted sharing?
What is the difference between fragment mode and passphrase mode?
#), which browsers never send to any server. Anyone with the full link can decrypt. Passphrase mode derives the key from a passphrase the sender picks; the ciphertext stays unreadable without it. Passphrase mode is safer if the link leaks; fragment mode is easier for low-friction sharing. See the comparison table above.Is a URL fragment really safe as an encryption key carrier?
#) to the server. It stays client-side and is only visible to JavaScript running in the recipient's tab. That's what makes the share link itself the decryption credential — the key rides with the recipient, not with the upload. You can verify this in your browser's Network tab: the request URL is truncated at the ? or #.Can PDF Pro or a court read files stored via client-side encrypted sharing?
What happens if I lose the link or forget the passphrase?
Is client-side encrypted PDF sharing free?
Does the recipient need an account?
Send one end-to-end encrypted link. Let it expire on schedule.
AES-256-GCM encryption in your browser. No signup, no server-side plaintext, no recovery backdoor.
sendCreate an Encrypted Link