Cryptographie expliquée

← Retour à l'accueil · Le contrat · Qui êtes-vous ? · Réseau P2P

En résumé : Vos messages sont protégés par plusieurs couches de cryptographie. Seul le destinataire peut les lire (chiffrement), et il peut vérifier que c'est bien vous qui les avez envoyés (signature). Tout cela sans que personne ne connaisse vos clés secrètes.

Comment ça marche en simple ?

Imaginez que vous voulez envoyer une lettre secrète à un ami. Dans le monde réel, vous pourriez :

  1. Mettre la lettre dans une enveloppe fermée (chiffrement) — seul celui qui a la clé peut l'ouvrir
  2. Signer l'enveloppe (signature) — pour prouver que c'est bien vous qui l'avez envoyée
  3. Donner la clé au destinataire (échange de clé) — mais sans que personne d'autre ne puisse l'intercepter

C'est exactement ce que fait la cryptographie numérique, mais de façon mathématiquement impossible à falsifier.

Les algorithmes utilisés

Voici les « outils » cryptographiques du système. Chacun a un rôle précis :

Algorithme Rôle Analogie
SHA-256 Empreinte unique du message Comme une empreinte digitale : unique et impossible à inverser
ECDH secp256k1 Échange de clé sécurisé Comme mélanger deux couleurs en public pour créer un secret commun
HKDF-SHA256 Dérivation de clé Transformer le secret partagé en une clé utilisable
AES-256-GCM Chiffrement du message Un coffre-fort numérique ultra-sécurisé
Schnorr secp256k1 Signature numérique Votre signature manuscrite, mais impossible à falsifier

Détail de chaque algorithme

SHA-256 — L'empreinte digitale

SHA-256 crée une « empreinte » unique de 64 caractères hexadécimaux (256 bits) pour n'importe quel message. Deux messages différents auront toujours des empreintes différentes.

Usage : identifier chaque message de façon unique sur le relais.

ECDH secp256k1 — Le secret partagé

ECDH (Elliptic Curve Diffie-Hellman) permet à deux personnes de créer un secret commun sans jamais l'échanger directement. C'est comme de la magie mathématique !

L'analogie des couleurs : Imaginez qu'Alice et Bob veulent créer une couleur secrète. Résultat : Alice et Bob ont la même couleur secrète, sans l'avoir jamais échangée ! Un espion qui a vu « couleur A » et « couleur B » ne peut pas retrouver la couleur finale.

Usage : créer un secret pour chiffrer les messages entre deux personnes.

HKDF-SHA256 — Le raffineur de clé

HKDF (HMAC-based Key Derivation Function) transforme le secret partagé ECDH en une clé de chiffrement de haute qualité.

AES-256-GCM — Le coffre-fort

AES-256-GCM est l'algorithme de chiffrement qui protège le contenu du message. Il offre à la fois la confidentialité (personne ne peut lire) et l'intégrité (personne ne peut modifier sans qu'on le sache).

Usage : chiffrer le message pour que seul le destinataire puisse le lire.

Schnorr secp256k1 — La signature

La signature Schnorr prouve que vous êtes bien l'auteur du message, sans révéler votre clé privée. Elle est plus efficace et plus simple que les signatures ECDSA traditionnelles.

Important : La signature prouve que vous avez signé, mais elle ne révèle jamais votre clé privée. Même en voyant 1000 de vos signatures, personne ne peut retrouver votre clé secrète.

Le workflow complet

Voici ce qui se passe quand vous envoyez un message sécurisé, étape par étape :

Phase 1 : Préparation

1 Création du message
Votre message est structuré avec : les données, un horodatage, un identifiant unique (UUID), et les règles de validation.
2 Calcul de l'empreinte (hash)
Message → SHA-256 → Hash (64 caractères)
Cette empreinte unique identifie le message sur le réseau.
3 Génération du nonce
Un nombre aléatoire unique (nonce) est créé pour éviter qu'un même message soit rejoué.

Phase 2 : Chiffrement

4 Échange de clé ECDH
Votre clé privée + Clé publique du destinataire → ECDH → Secret partagé
Un secret commun est calculé mathématiquement, sans jamais être transmis.
5 Dérivation de la clé AES
Secret partagé → HKDF-SHA256 → Clé AES-256
Le secret est transformé en une clé de chiffrement de qualité.
6 Chiffrement du message
Clé AES + IV aléatoire + Message → AES-256-GCM → Message chiffré + Tag
Le message est enfermé dans un « coffre-fort » numérique.

Phase 3 : Signature

7 Signature Schnorr
Hash + Nonce + Votre clé privée → Schnorr → Signature
Vous signez l'empreinte du message avec votre clé privée.

Phase 4 : Publication sur le relais

8 Envoi au relais
Trois éléments sont envoyés séparément :

Phase 5 : Collecte des signatures (multi-signature)

9 Attente des co-signataires
Si le contrat exige plusieurs signatures (ex: 2 appareils sur 3), le système attend que les autres signent :
10 Validation
Le message est validé quand :

Phase 6 : Réception et déchiffrement

11 Scan des clés
Le destinataire interroge le relais pour récupérer les MsgCle récentes.
12 Récupération du message
Avec le hash trouvé dans la MsgCle, il récupère le message chiffré.
13 Déchiffrement ECDH inverse
Sa clé privée + Clé publique de l'émetteur (df) → ECDH → Même secret partagé
Il recalcule le même secret, puis déchiffre avec AES-GCM.
14 Vérification des signatures
Chaque signature est vérifiée avec la clé publique du signataire.

Schéma récapitulatif

┌─────────────────────────────────────────────────────────────────┐ │ ÉMETTEUR │ ├─────────────────────────────────────────────────────────────────┤ │ Message → SHA-256 → Hash │ │ │ │ Clé privée émetteur ─┐ │ │ ├──→ ECDH → Secret partagé │ │ Clé publique dest. ──┘ │ │ │ │ Secret partagé → HKDF-SHA256 → Clé AES-256 │ │ │ │ Clé AES + IV + Message → AES-256-GCM → Message chiffré │ │ │ │ Hash + Nonce + Clé privée → Schnorr → Signature │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ RELAIS │ ├─────────────────────────────────────────────────────────────────┤ │ POST /messages ← MsgChiffre (hash, message_chiffre) │ │ POST /keys ← MsgCle (hash, iv, df_ecdh = clé pub émett.) │ │ POST /signatures← MsgSignature (hash, signature, clé publique) │ │ │ │ ... attente des co-signatures (GET /signatures/:hash) ... │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ DESTINATAIRE │ ├─────────────────────────────────────────────────────────────────┤ │ GET /keys?start=&end= → Liste des MsgCle récentes │ │ GET /messages/:hash → MsgChiffre │ │ GET /signatures/:hash → MsgSignature[] │ │ │ │ Clé privée dest. ────┐ │ │ ├──→ ECDH → Même secret partagé │ │ Clé publique émett. ─┘ (df_ecdh_scannable) │ │ │ │ Secret partagé → HKDF-SHA256 → Clé AES-256 │ │ │ │ Clé AES + IV + Ciphertext → AES-256-GCM → Message original │ │ │ │ Vérification : Signature + Clé publique → Schnorr verify → OK │ └─────────────────────────────────────────────────────────────────┘

Pourquoi c'est sécurisé ?

Confidentialité

Intégrité

Authenticité

Séparation des données

Détails techniques pour les développeurs

Paramètres cryptographiques

ParamètreValeur
Courbe elliptiquesecp256k1 (256 bits)
Taille clé AES256 bits
Taille IV (AES-GCM)96 bits (12 octets)
Taille Tag (AES-GCM)128 bits (16 octets)
HashSHA-256 (256 bits)
KDFHKDF-SHA256
SignatureSchnorr secp256k1 (64 octets)

Bibliothèques utilisées

Format des clés

Fichiers source

Collecte des signatures

ConstanteValeurDescription
COLLECT_POLL_MS2 000 msIntervalle entre chaque interrogation
COLLECT_TIMEOUT_MS300 000 msTimeout global (5 minutes)
COLLECT_FETCH_TIMEOUT_MS15 000 msTimeout par requête

En résumé

Le système combine plusieurs couches de protection :
  1. ECDH pour créer un secret sans jamais l'échanger
  2. AES-256-GCM pour chiffrer le message
  3. Schnorr pour prouver votre identité
  4. SHA-256 pour identifier chaque message de façon unique
  5. Multi-signature pour exiger plusieurs validations
Résultat : vos messages sont confidentiels, authentiques et infalsifiables.

← Retour à l'accueil · Le contrat · Qui êtes-vous ? · Réseau P2P