Dépôt zero-knowledge par QR code et échange éphémère
Spécification du protocole de soumission de documents entre un client non authentifié et un destinataire identifié (p. ex. un avocat, un notaire, un expert-comptable). Chiffrement de bout en bout, serveur honnête-mais-curieux, aucun compte côté client.
Pour le contexte produit, voir la page /deposer. Pour le protocole d'échange asynchrone (flux Demander / Envoyer), voir le livre blanc technique.
En bref
Signe une clé éphémère EK_pk avec son identité Ed25519. Publie la
charge signée dans le QR code.
Vérifie la signature. Chiffre le fichier avec une DEK neuve. Dérive une clé d'enveloppe via X25519+HKDF. Téléverse.
Rejoue l'ECDH, dérive la même clé d'enveloppe, déballe la DEK, déchiffre. Serveur exclu à toutes les étapes.
Primitives : X25519 · Ed25519 · HKDF-SHA256 · AES-256-GCM ou ChaCha20-Poly1305.
1. Introduction
La collecte sécurisée de documents est un besoin récurrent en contexte juridique, financier ou d'enquête. Les approches classiques — courriel, téléversement web — exposent des données sensibles à des intermédiaires non nécessaires.
Ce protocole apporte :
- chiffrement de bout en bout (E2EE) ;
- serveur zero-knowledge (incapable de déchiffrer) ;
- aucune authentification côté client ;
- onboarding par lecture d'un QR code ;
- regroupement des dépôts au niveau d'une session.
2. Objectifs de conception
2.1 Objectifs de sécurité
- Confidentialité : seul le destinataire peut déchiffrer les fichiers.
- Intégrité : toute altération est détectable.
- Authenticité : le client chiffre effectivement vers le destinataire prévu.
- Isolation : chaque soumission est cryptographiquement indépendante des autres.
- Confidentialité persistante (optionnelle) : une compromission future des clés ne révèle pas les dépôts passés.
2.2 Objectifs d'ergonomie
- aucune création de compte ;
- parcours en un seul scan de QR code ;
- dépôts multi-fichiers au sein d'une session ;
- serveur stateless ou à état minimal.
3. Modèle du système
3.1 Acteurs
- Destinataire (p. ex. avocat, notaire) : détenteur d'une clé d'identité à long terme.
- Client (déposant) : expéditeur anonyme, non authentifié.
- Serveur : couche de stockage et de routage, supposée zero-knowledge.
3.2 Modèle de confiance
- Serveur : honnête-mais-curieux.
- Réseau : non fiable.
- Distribution du QR code : de confiance ou vérifiable.
4. Primitives cryptographiques
- Échange de clés : ECC —
X25519. - Signatures : EdDSA —
Ed25519. -
Chiffrement symétrique authentifié :
AES-256-GCMouChaCha20-Poly1305. - Dérivation :
HKDF-SHA256.
5. Vue d'ensemble du protocole
5.1 Initialisation (destinataire)
Le destinataire génère une paire de clés d'identité à long terme :
IK_sign_sk, IK_sign_pk // Ed25519 Pour chaque session, il génère une paire de clés de chiffrement éphémère, un identifiant de session aléatoire et signe les métadonnées :
EK_sk, EK_pk // X25519, éphémère
session_id // 128 bits aléatoires
{
"session_id": "...",
"ek_pk": "...",
"expires_at": "...",
"signature": Sign(IK_sign_sk, ek_pk || session_id || expires_at)
} Cette charge utile est servie via HTTPS ou encodée dans le QR code affiché au cabinet.
5.2 Flux côté client
Après lecture du QR code, le navigateur du client exécute les étapes suivantes.
Étape 1 — Vérification
- vérifier la signature avec
IK_sign_pk; - vérifier l'expiration.
Étape 2 — Chiffrement du fichier
DEK = random(32 bytes)
ciphertext = AEAD(DEK, file) Étape 3 — Encapsulation de la DEK
es_sk, es_pk = keygen(X25519) // clé éphémère de l'expéditeur
ss = X25519(es_sk, EK_pk) // secret partagé
wrap_key = HKDF(ss, info="file-dek-wrap")
wrapped_dek = AEAD(wrap_key, DEK) Étape 4 — Téléversement
{
"session_id": "...",
"es_pk": "...",
"file_ciphertext": "...",
"wrapped_dek": "...",
"nonces": { ... },
"aad": { ... }
} 5.3 Flux côté destinataire
Pour chaque dépôt :
ss = X25519(EK_sk, es_pk)
wrap_key = HKDF(ss, info="file-dek-wrap")
DEK = AEAD_open(wrap_key, wrapped_dek)
plaintext = AEAD_open(DEK, file_ciphertext) 6. Gestion de session
6.1 Identifiant de session
- valeur aléatoire sur 128 bits ;
- incluse dans la charge signée ;
- sert de clé de regroupement des dépôts.
6.2 Propriétés
- non secrète ;
- doit être authentifiée (signature ou associated data de l'AEAD) ;
- permet un regroupement UI sans compromettre la confidentialité des dépôts.
7. Analyse de sécurité
7.1 Confidentialité
DEK unique par fichier, protégée par X25519. Le serveur ne voit jamais de clair.
7.2 Intégrité
AEAD sur le chiffré, associated data liant chaque chiffré à son
session_id — pas de détournement inter-dépôts.
7.3 Authenticité
EK_pk signée par l'identité Ed25519 du destinataire. Pas de
substitution sans invalider la signature.
7.4 Isolation
Chaque dépôt utilise une DEK neuve et une clé éphémère d'expéditeur neuve.
7.5 Confidentialité persistante
Obtenue si les clés éphémères sont effacées après usage. Non obtenue en mode dérivation déterministe (cf. § 8).
Section optionnelle
8. Construction alternative : dérivation déterministe
Section optionnelle
8. Construction alternative : dérivation déterministe
Plutôt que de stocker EK_sk, on peut la dériver d'une clé maîtresse
du destinataire :
EK_sk = HKDF(master_sk, session_id) | Propriété | Dérivation déterministe | Éphémère |
|---|---|---|
| Stockage | minimal | requiert du stockage |
| Confidentialité persistante | absente | possible |
| Simplicité | élevée | moyenne |
9. Modèle de menace et mitigations
| Menace | Mitigation |
|---|---|
| Substitution de clé | signature Ed25519 sur la clé éphémère |
| Rejeu | expires_at + nonce unique par chiffré
|
| Compromission serveur | E2EE — serveur zero-knowledge |
| Fuite de métadonnées | minimiser les champs persistés |
| Dépôts malveillants | rate limiting, analyse antivirus hors bande côté destinataire |
10. Considérations d'implémentation
- n'utiliser que des bibliothèques auditées (libsodium, WebCrypto) ;
- ne jamais réutiliser un nonce avec une même clé ;
- valider strictement toutes les entrées, y compris la taille ;
- privilégier les opérations en temps constant là où la valeur secrète influence un chemin critique.
11. Extensions futures
- signatures anonymes côté expéditeur ;
- chiffrement vers plusieurs destinataires (rewrapping sur la DEK) ;
- déchiffrement en enclave sécurisée côté destinataire ;
- journalisation d'audit sans casser la propriété zero-knowledge.
12. Conclusion
Ce protocole montre que :
- la soumission zero-knowledge est réalisable sans compromis majeur côté ergonomie ;
- l'onboarding par QR code améliore fortement l'adoption ;
- la combinaison clé éphémère + signature d'identité offre des garanties fortes (confidentialité, intégrité, authenticité).
Le design arbitre entre rigueur cryptographique, simplicité opérationnelle et utilisabilité réelle en cabinet.
Annexes
Annexe A — Terminologie
- DEK — Data Encryption Key.
- AEAD — Authenticated Encryption with Associated Data.
- E2EE — End-to-End Encryption.
- Tous les termes sont également définis dans le glossaire.
Annexe B — Stack de référence
-
X25519pour l'échange de clés. -
Ed25519pour les signatures. -
HKDF-SHA256pour la dérivation. -
AES-256-GCMouChaCha20-Poly1305pour le chiffrement authentifié.
Questions fréquentes
Que signifie « zero-knowledge » pour ce protocole ?
Le serveur ne voit jamais les fichiers en clair ni les clés capables de les déchiffrer. Le chiffrement s'effectue côté client avant l'envoi ; la clé privée permettant de déballer la DEK ne quitte pas l'appareil du destinataire. Même en cas de compromission du serveur ou de réquisition judiciaire, l'hébergeur ne peut livrer que des octets opaques.
Pourquoi X25519 et Ed25519 plutôt que RSA ?
X25519 et Ed25519 sont des primitives sur courbes elliptiques modernes, standardisées, plus rapides et plus compactes que RSA à niveau de sécurité équivalent. X25519 est adapté à l'échange de clés Diffie-Hellman, Ed25519 aux signatures ; les deux sont disponibles partout (WebCrypto, libsodium) et sans paramètres à ajuster. RSA-4096 reste utilisé ailleurs dans notre architecture pour l'échange asynchrone ; voir le livre blanc technique.
Le client doit-il créer un compte pour déposer ?
Non. Le client scanne le QR code, son navigateur vérifie la signature de la clé éphémère du destinataire, puis chiffre et téléverse. Aucune inscription, aucun mot de passe, aucun cookie persistant n'est requis côté client.
Qu'est-ce qui empêche un tiers de déposer n'importe quel fichier ?
Rien cryptographiquement — c'est par conception, pour permettre l'usage anonyme. Le contrôle se fait en amont (le QR code est remis par le destinataire à la personne concernée) et en aval (limitation de débit, analyse antivirus côté destinataire après déchiffrement, purge des sessions expirées). L'identifiant de session et l'horodatage signés offrent de la traçabilité côté destinataire.
Peut-on prouver qui a déposé quoi après coup ?
Le protocole privilégie la confidentialité à l'identification. La session est identifiée, horodatée et signée par le destinataire, ce qui prouve « un dépôt a été fait dans cette session » mais n'identifie pas cryptographiquement l'expéditeur anonyme. Pour un besoin de preuve d'identité, le flux « Demander des pièces » (lien nominatif + double vérification email + SMS) est plus adapté.
Quelles sont les garanties si la clé éphémère fuit plus tard ?
Si les clés éphémères EK_sk sont effacées après usage (mode recommandé), la confidentialité des dépôts passés reste protégée : une compromission future ne permet pas de déchiffrer rétroactivement. Si le mode « dérivation déterministe » est choisi (§ 8), cette propriété de confidentialité persistante est perdue au profit d'un stockage minimal.
Questions côté sécurité ?
Écrivez à notre équipe. Nous sommes à l'aise avec des interlocuteurs DSI, RSSI ou cryptographes, et répondons par écrit pour que vous puissiez archiver la réponse.
Écrire à l'équipe sécurité