Cryptographie

Tout ce qui circule sur Velum est chiffré de bout en bout avec un schéma hybride : classique (X25519) plus post-quantique (ML-KEM-768). Si l’un des deux tombait, l’autre continuerait de protéger le message.

Identité, portefeuille et appareils

Tout part d’une phrase de récupération de 24 mots (BIP-39, 256 bits). La liste de mots suit la langue de l’appareil ; le russe utilise la liste anglaise, faute de liste officielle.

graine       = BIP39.mnemonicToSeed(phrase)                      64 octets
identité     = HKDF-SHA512(graine, info = "velum/v2/identity")   ed25519
portefeuille = HKDF-SHA512(graine, info = "m/44'/7420'/0'/0'/0'")   ed25519
boîte        = HKDF-SHA512(graine, info = "velum/v2/mailbox")    32 o
  • L’identité signe ton profil et ta liste d’appareils. Seuls tes contacts la connaissent (par QR code ou lien) ; elle ne circule jamais en clair sur le réseau.
  • Le portefeuille signe les transactions. C’est une autre clé, pour que personne ne puisse relier conversations et paiements.
  • Chaque appareil possède sa clé aléatoire, qui ne le quitte jamais : ed25519 (signature), X25519 et ML-KEM-768 (chiffrement).

Les adresses sont vel suivi du base58 de la clé publique ed25519 (32 octets). Voir Portefeuilles et plateformes d’échange.

Liste d’appareils

Chaque compte publie à ses contacts, à l’intérieur de messages chiffrés de type profile, une liste signée par l’identité :

DeviceList = { identity, devices: [{ id, sign, x25519, kem, mailboxSeed, added, name }], ts, sig }

La liste n’est jamais publiée dans la chaîne. Elle accepte jusqu’à 5 appareils. Retirer un appareil produit une nouvelle liste signée sans lui et fait tourner le secret de boîte.

L’enveloppe hybride

Pour chaque appareil destinataire :

eph            = X25519 éphémère
(kemCt, kemSs) = ML-KEM-768.encapsulate(appareil.kem)
clé            = HKDF-SHA512(ikm = X25519(eph, appareil.x25519) ‖ kemSs,
                             salt = eph.pub ‖ kemCt,
                             info = "velum/v2/envelope", 32 octets)
chiffré        = XChaCha20-Poly1305(clé, nonce de 24 o)

Format : [version 2][32 eph][1088 kemCt][24 nonce][texte chiffré]. C’est la même approche que Signal PQXDH et Apple PQ3 : un attaquant devrait casser à la fois X25519 et ML-KEM-768.

Expéditeur scellé

De l’extérieur, une enveloppe ne dit pas qui l’envoie. À l’intérieur se trouvent :

  • Le contenu (Payload) signé par la clé d’appareil de l’expéditeur.
  • L’identité de l’expéditeur.
  • Un certificat : la signature de cette identité sur cet appareil.

Le destinataire sait ainsi que le message vient de cette personne, et personne d’autre ne peut le savoir.

Groupes

Le contenu d’un groupe est chiffré une seule fois avec une clé aléatoire. Cette clé est scellée (avec le schéma hybride) pour chaque appareil de chaque membre. Chaque copie ressemble à un message individuel : ni les nœuds ni un observateur ne peuvent savoir qu’il s’agit d’un groupe, ni combien de membres il compte.

Remplissage

Avant d’être découpée, l’enveloppe est complétée jusqu’à la taille fixe suivante : 2 Ko, 8 Ko, 32 Ko, 128 Ko, 512 Ko, 2 Mo ou 8 Mo. Un « salut » et un court message vocal peuvent peser exactement la même chose. La taille réelle est à l’intérieur, chiffrée.

Confidentialité persistante par rotation

Chaque appareil renouvelle sa paire X25519 + ML-KEM toutes les 24 heures et annonce la nouvelle dans son profil. Il conserve les précédentes 7 jours pour ouvrir les messages en retard, puis les efface. Si quelqu’un volait aujourd’hui la clé d’un appareil, il ne pourrait pas ouvrir les messages de plus d’une semaine.

Le triple ratchet complet (confidentialité persistante message par message) est dans la feuille de route.

Ce que l’attestation protège, et ce qu’elle ne protège pas

L’app demande à Apple une preuve (App Attest) qu’il s’agit de l’app d’origine, non modifiée, sur un vrai iPhone. Cette preuve protège le réseau contre le spam et le vol de récompenses. Ce n’est pas elle qui protège tes messages : même avec une app modifiée, personne ne peut lire les messages des autres. C’est la cryptographie qui le garantit.

Algorithmes

Usage Algorithme
Signatures (identité, portefeuille, appareil, nœuds) ed25519
Échange de clés classique X25519
Encapsulation post-quantique ML-KEM-768 (FIPS 203)
Dérivation de clés HKDF-SHA512
Chiffrement authentifié XChaCha20-Poly1305
Reçus HMAC-SHA512 et SHA-512
Phrase de récupération BIP-39, 24 mots
Identifiants de transaction SHA-256 du JSON canonique