Sommaire

Sommaire

  1. Introduction
  2. Primitives cryptographiques
  3. Terminologie
  4. Établissement de la session
  5. Structure d'un message
  6. Calcul du jeu de clé AES
  7. Garanties
  8. Nous contacter
01 — Introduction

Le transport binaire qui protège vos conversations

Le protocole japap est conçu pour empêcher les tiers d'accéder aux messages en clair échangés entre le client et le serveur. Même si la sécurité d'un appareil est compromise, un intrus ne pourra pas exploiter cette ouverture pour déchiffrer les messages.

Un protocole de messagerie mobile doit tenir trois promesses en même temps : chiffrer chaque octet, tenir sur une connexion intermittente, et démarrer instantanément sur un téléphone qui vient de sortir du mode avion. Voici comment japap tient ces trois promesses.

Les algorithmes utilisés lors de l'établissement de la session sont RSA 2048 et AES-256. Une fois la session établie, tous les messages sont chiffrés en AES-256-CBC avec une clé dérivée, unique pour chaque message.

02 — Primitives cryptographiques

Quatre primitives, aucune concession

japap s'appuie exclusivement sur des algorithmes cryptographiques standards, publiés, éprouvés par vingt ans d'analyse publique. Aucune invention maison dans la crypto elle-même.

Diffie-Hellman
2048 bits

Permet à deux appareils qui ne se sont jamais parlé de dériver un secret commun sans jamais le transmettre. La clé reste dans vos appareils.

RSA
2048 bits

Protège la phase d'échange de clés contre toute interception. Les paramètres Diffie-Hellman transitent uniquement sous enveloppe RSA.

AES-256
Mode CBC

Chiffre chaque message avec une clé dérivée unique. Deux messages identiques produisent deux chiffrés totalement différents.

MAC à clé
SHA-1 HMAC

Authentifie chaque message envoyé. Une seule altération d'un octet suffit à faire rejeter la frame. Impossible à forger sans la clé.

03 — Terminologie

Six termes à connaître

Six termes reviennent tout au long de ce document. Voici leur définition précise.

Identifiant de message
64 bits

Identifie de manière unique chaque message dans une session. Prévient les attaques par rejeu.

Clé de message
128 bits

Les 128 derniers bits du SHA-1 du message à chiffrer (entête externe exclu). Sert à générer le jeu de clé AES.

Clé de session
2048 bits

Clé partagée entre client et serveur, créée lors de l'établissement de la session. N'est jamais transmise sur le réseau.

Jeu de clé AES
48 octets

32 octets de clé et 16 octets de vecteur d'initialisation, utilisés pour AES-256-CBC. Dérivé à chaque message.

Entête externe
24 octets

Ajouté avant le message chiffré. Contient l'identifiant de clé de session (8 octets) et la clé de message (16 octets).

Identifiant de clé de session
64 bits

Les 64 derniers bits du SHA-1 de la clé de session. Permet au serveur de retrouver la clé utilisée pour chiffrer un message.

04 — Établissement de la session

Un ballet en 8 actes

Une session est créée lors de la première ouverture de l'application ou après une déconnexion. Les algorithmes utilisés sont RSA 2048 et AES-256. Avant l'établissement, certains messages transitent en clair — mais un intrus ne peut rien en faire.

  1. Demande des paramètres

    Le client envoie au serveur un nonce de 128 bits généré aléatoirement. Ce nonce identifie le client durant tout l'échange. Après cette étape, il est connu des deux parties.

  2. Réponse du serveur

    Le serveur renvoie : le nonce du client, son propre nonce (128 bits), un nombre pq (produit de deux premiers impairs) et une empreinte de sa clé publique RSA. La paire (nonce client, nonce serveur) identifie le couple pendant tout l'échange — un intrus ne peut pas créer de session parallèle avec les mêmes paramètres, car un nouveau nonce serveur est généré pour chaque tentative.

  3. Factorisation de pq

    Le client décompose pq en facteurs premiers p et q. À ce stade, l'échange Diffie-Hellman peut commencer.

  4. Envoi chiffré RSA

    Le client génère un nouveau nonce aléatoire de 256 bits, construit un message m contenant pq, p, q, la paire de nonces et ce nouveau nonce, puis le chiffre avec la clé publique RSA du serveur selon la construction ci-dessous. Après cette étape, le nouveau nonce n'est connu que du client et du serveur.

    $$m = pq \mathbin\Vert p \mathbin\Vert q \mathbin\Vert \text{(paire de nonces)} \mathbin\Vert \text{(nouveau nonce)}$$
    $$m_{1} = \mathrm{sha1}(m) \mathbin\Vert m \mathbin\Vert \text{rand}$$
    $$\mathrm{RSA}_{\mathrm{pub}}(m_{1})$$

    rand complète $m_{1}$ à 255 octets.

    Protection contre l'homme-du-milieu

    Un intrus peut intercepter cette requête et la remplacer par la sienne, mais il devrait alors régénérer son propre nouveau nonce sans jamais pouvoir déchiffrer m₁. Comme tous les messages suivants contiennent le hash de ce nouveau nonce, les valeurs divergeront côté client et seront rejetées à la vérification. L'interception aboutit simplement à l'échec de la session côté client — rien d'exploitable.

  5. Réponse AES-256

    Le serveur répond avec la paire de nonces et un message chiffré AES-256 contenant les 128 derniers bits du SHA-1 du nouveau nonce, la paire de nonces, un entier g, un nombre premier p de 2048 bits, et g_a. Le client est ainsi certain que la réponse vient bien du serveur, puisqu'elle est chiffrée avec une clé dérivée du nouveau nonce.

    $$g\_a = g^{a} \bmod p$$

    où $a$ est un entier de 2048 bits connu uniquement du serveur.

  6. Contribution du client

    Le client tire b, un entier aléatoire de 2048 bits, et envoie au serveur la paire de nonces accompagnée d'un message AES-256-CBC contenant g_b.

    $$g\_b = g^{b} \bmod p$$
  7. Dérivation de la clé de session

    La clé de session est calculée indépendamment des deux côtés. Les deux résultats sont mathématiquement identiques.

    $$\text{serveur :}\quad (g\_b)^{a} \bmod p$$
    $$\text{client :}\quad (g\_a)^{b} \bmod p$$
    = $$g^{ab} \bmod p$$

    Cette clé de 2048 bits n'est jamais transmise sur le réseau.

  8. Identifiant de clé de session

    Les 64 derniers bits du SHA-1 de la clé de session servent d'identifiant public, permettant au serveur de retrouver la bonne clé pour chaque message.

    $$\text{authKeyId} = \mathrm{substr}(\mathrm{sha1}(\text{(clé de session)}),\, -64,\, 64)$$

Fin du processus. Tous les messages peuvent désormais être échangés de manière sécurisée selon la structure décrite ci-dessous.

05 — Structure d'un message

Ce que voit un observateur sur le réseau

Chaque message échangé après l'établissement de la session est composé de trois blocs. Voici ce que voit un observateur sur le réseau — et ce qu'il ne peut pas voir.

Identifiant de clé de session
64 bits
Clé de message
128 bits
Charge utile chiffrée
multiple de 128 bits
Identifiant de clé de session Permet au serveur de retrouver la clé de session en mémoire. La clé elle-même ne transite jamais.
Clé de message Les 128 derniers bits du SHA-1 du message en clair. Sert à dériver le jeu de clé AES et garantit l'intégrité : toute altération produit une clé de message différente, et le déchiffrement échoue.
Charge utile chiffrée Chiffrée en AES-256-CBC. Contient l'identifiant du message, la taille des données, puis les données elles-mêmes. Un padding aléatoire complète la charge à un multiple de 128 bits.
06 — Calcul du jeu de clé AES

Comment la clé AES est dérivée à chaque message

La clé de session (2048 bits) et la clé de message (128 bits) servent à calculer le jeu de clé AES utilisé pour chiffrer un message. La clé AES et le vecteur d'initialisation ne transitent jamais sur le réseau ; chaque extrémité les recalcule à partir du même algorithme.

Notation

Dérivation

$$\lambda = \mathrm{sha1}(MK \mathbin\Vert \mathrm{substr}(SK,\; \mathit{Offset},\; 32))$$
$$\alpha = \mathrm{sha1}(\mathrm{substr}(SK,\; 32 + \mathit{Offset},\; 16) \mathbin\Vert MK \mathbin\Vert \mathrm{substr}(SK,\; 48 + \mathit{Offset},\; 16))$$
$$\beta = \mathrm{sha1}(\mathrm{substr}(SK,\; 64 + \mathit{Offset},\; 32) \mathbin\Vert MK)$$
$$\Omega = \mathrm{sha1}(MK \mathbin\Vert \mathrm{substr}(SK,\; 96 + \mathit{Offset},\; 32))$$
$$x = \mathrm{substr}(\lambda, 0, 8) \mathbin\Vert \mathrm{substr}(\alpha, 8, 12) \mathbin\Vert \mathrm{substr}(\beta, 4, 12)$$
$$y = \mathrm{substr}(\lambda, 8, 6) \mathbin\Vert \mathrm{substr}(\alpha, 0, 8) \mathbin\Vert \mathrm{substr}(\beta, 16, 2) \mathbin\Vert \mathrm{substr}(\Omega, 0, 4)$$
$$\boxed{\text{AES key set} = x \mathbin\Vert y}$$

Les 48 octets du résultat se décomposent en 32 octets de clé AES et 16 octets de vecteur d'initialisation. Lorsque la taille des données n'est pas un multiple de 16 octets, un padding aléatoire est ajouté avant le chiffrement.

07 — Garanties

Les promesses de japap

Au-delà des primitives et de leur composition, japap vous garantit trois propriétés fondamentales, vérifiables mathématiquement.

Confidentialité

Seul le détenteur de la clé de session peut déchiffrer le contenu. Sans cette clé, AES-256 en mode CBC est considéré hors de portée de toute puissance de calcul raisonnablement accessible.

Intégrité

Toute modification du chiffré — même d'un seul octet — produit un message corrompu dont la clé de message ne correspond plus. La frame est rejetée avant d'atteindre la logique métier.

Authenticité

La clé de message ne peut être produite que par un appareil qui détient la clé de session. Le serveur sait ainsi que chaque message vient bien d'un client authentifié, sans ambiguïté possible.

08 — Nous contacter

Parlons-en

Notre équipe sécurité répond à chaque question. Chercheur, intégrateur, utilisateur curieux : écrivez-nous, nous vous répondons.

operations@ondjoss.com

RETOUR