Skip to main content

Encryption Protocol

Last updated: September 28, 2026 · Pli Scellé

This document describes the end-to-end encryption (E2E) protocol implemented by Pli Scellé. All cryptographic operations use the W3C Web Crypto API - no external cryptographic library is used.

1. Cryptographic Primitives

Cryptographic primitives used by Pli Scellé
FunctionAlgorithmParameters
Symmetric encryptionAES-256-GCM256-bit key, 96-bit IV, built-in authentication tag
Key generation (files and secrets)AES-256 randomBrowser CSPRNG via Web Crypto API
Random number generationCSPRNGOperating system entropy source
Password hashing (access control)argon2idServer-side, with cryptographically random salt

2. Zero-Knowledge Architecture

In E2E mode, the server never has access to the encryption key or plaintext content. The key is generated client-side and transmitted exclusively via the URL fragment (#key=...), which is never sent to the server by the browser (RFC 3986 §3.5).

What the server can access in each mode
DataE2E modeNon-E2E modeNotes
Source file / plaintext secretNoYesE2E: encrypted client-side before upload. Non-E2E: the server performs the encryption and can decrypt it
Encryption keyNoYesE2E: stays in the URL fragment, never sent. Non-E2E: generated and held by the server
Encrypted file (ciphertext)YesYesStored encrypted
IVYesYesRequired for decryption, not secret per AES-GCM spec
Access password hashYesYesargon2id hash, never the plaintext password

Consequence: even with full database and storage access, an attacker cannot decrypt E2E shares without the key held exclusively by the sender and recipient.

3. File Encryption

Files are encrypted in the browser before upload. A random AES-256 key is generated per file via the Web Crypto API, and the content is encrypted with AES-256-GCM. The key is exported as a base64url fragment in the share URL. Because the fragment is never included in HTTP requests, the server never receives it.

4. Secret Encryption (Passwords & Text)

  1. A random AES-256 key is generated in the browser via the Web Crypto API, as for files
  2. The plaintext is encrypted with AES-256-GCM using a fresh random 96-bit IV
  3. The key is placed in the fragment of the share URL, never sent to the server
  4. The server stores only the ciphertext and the IV, never the plaintext or the key

Decryption by recipient: the browser reads the key from the URL fragment, fetches the ciphertext and decrypts the secret entirely client-side.

Access password: it does not encrypt anything. It is a server-side access control: the server keeps only an argon2id hash of it and releases the ciphertext only once the password is verified.

5. Share Lifecycle

  1. Creation: the sender encrypts content in the browser, uploads the ciphertext, receives a unique URL with the key in the fragment
  2. Sharing: the URL is transmitted out-of-band (email, messaging, etc.)
  3. Access: the recipient opens the URL → the browser extracts the key from the fragment → downloads the ciphertext → decrypts locally
  4. Expiration: after the configured duration (1 hour to 30 days, depending on the plan) or maximum view count, the share is permanently purged - ciphertext deleted from storage, metadata erased from database
  5. Revocation: the sender can destroy a share at any time from their dashboard

6. Transport Security

7. Storage & Data Retention

8. Quantum Resistance

Pli Scellé's encryption relies on AES-256-GCM (symmetric), with a random 256-bit key. This algorithm is considered resistant to quantum attacks: Grover's algorithm reduces the effective security of AES-256 to ~AES-128, a level still considered secure by NIST and ANSSI.

The current sharing flow does not use asymmetric key exchange (RSA, ECDH) - the algorithms vulnerable to quantum attacks are not present in the protocol.

For future features requiring asymmetric exchange, the architecture is designed to integrate ML-KEM (Kyber, FIPS 203) in hybrid mode (classical + post-quantum) when browser standards (Web Crypto API) and audited libraries become available.

Shares on Pli Scellé are ephemeral (expiration from 1 hour to 30 days depending on the plan, automatic purge). The "store now, decrypt later" scenario - where an attacker captures ciphertext today and decrypts it in 10-20 years with a quantum computer - does not apply to ephemeral data that no longer exists.

9. Transparency & Security Posture