Aller au contenu principal
documents-securises.fr documents-securises.fr
Livre blanc technique

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

1 Destinataire

Signe une clé éphémère EK_pk avec son identité Ed25519. Publie la charge signée dans le QR code.

2 Client

Vérifie la signature. Chiffre le fichier avec une DEK neuve. Dérive une clé d'enveloppe via X25519+HKDF. Téléverse.

3 Destinataire

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-GCM ou ChaCha20-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

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

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é