OV Message — White Paper Technique

Version 1.0.0 — Avril 2026

Classification : Public

1. Introduction

OV Message est une application de messagerie chiffrée de bout en bout fonctionnant sans serveur centralisé. Les messages sont chiffrés avant envoi et déchiffrés à réception, indépendamment du canal de transport utilisé. L'implémentation actuelle utilise le réseau SMS, mais le protocole de chiffrement est agnostique au transport — il fonctionne sur tout canal capable de transmettre du texte.

Architecture sans serveur : Ce choix délibéré élimine un point de défaillance unique, supprime la nécessité de faire confiance à un opérateur tiers, et ne requiert aucune connexion Internet.

Le présent document décrit les mécanismes cryptographiques employés, les choix de conception, et les limites connues du système.

2. Modèle de menace

2.1 Menaces couvertes

Interception du canal

Opérateur, FAI, attaquant réseau — Chiffrement E2E, le canal ne voit que du texte chiffré.

Modification en transit

HMAC-SHA256, toute altération invalide le tag d'authentification.

Rejeu de messages

Anti-rejeu par stockage de tags (128 bits, indépendant de l'horloge).

Analyse fréquentielle

Chiffrement par flux basé sur SHA3-256, aucune correspondance fixe caractère-à-caractère.

Clair connu

Index aléatoire par message, un couple (clair, chiffré) n'aide pas pour un autre message.

Phishing

Mode Forteresse, suppression automatique des messages non authentifiés.

Extraction forensique

Cellebrite, JTAG — KEK/DEK, clés chiffrées au repos, DEK détruit au verrouillage.

Saisie en arrière-plan

Verrouillage automatique natif, kill du process, RAM libérée par l'OS.

Contrainte physique

Mode Panic, destruction des données via mot de passe alternatif.

Capture d'écran

Flag système anti-capture sur toutes les fenêtres de l'application.

Backup cloud

Backup désactivé sur tous les domaines (cloud, local, transfert).

Brute force

Argon2id (64 Mo par tentative) + 3 échecs = Panic automatique.

Deep links

Deep links bloqués quand un mot de passe est actif.

Rétrogradation

Si une clé existe, l'application chiffre systématiquement. Aucun envoi en clair possible.

Compromission contact

Isolation par contact, chaque clé produit des alphabets et clés MAC indépendants.

Fuite notifications

Notifications anonymisées (Mode Forteresse), aucun nom, aucun aperçu.

2.2 Hors périmètre

Compromission du système d'exploitation (root/jailbreak actif avec keylogger). Attaque par canal auxiliaire sur le matériel cryptographique.

3. Architecture générale

3.1 Stack technique

ComposantTechnologie
FrameworkReact Native 0.83 / Expo 55
MoteurHermes (bytecode compilé)
CryptographieBindings natifs OpenSSL (SHA3-256, HMAC-SHA256, AES-256-GCM, HKDF, Argon2id, ECDH X25519)
Stockage sensibleAndroid Keystore
Stockage non sensibleBase de données locale

3.2 Séparation des données

Clés de contact

Keystore sécurisé — Android Keystore + chiffrement DEK (AES-256-GCM)

Mots de passe hachés

Keystore sécurisé — Android Keystore

DEK enveloppé

Keystore sécurisé — AES-256-GCM sous KEK dérivée d'Argon2id

Conversations

Stockage local — Stockées sous forme chiffrée (format OV)

3.3 Principe de conception

Séparation des responsabilités : Toute la logique cryptographique est isolée dans une couche de services dédiée, séparée de l'interface utilisateur. Chaque service a une responsabilité unique.

4. Protocole de chiffrement des messages

4.1 Vue d'ensemble

OV Message utilise un chiffrement par flux basé sur le hachage (hash-based stream cipher). Chaque caractère du message est chiffré individuellement par un index de substitution dérivé de SHA3-256, dépendant de la position, d'un index aléatoire unique au message, et d'une sous-clé dérivée de la clé de contact.

Pas un chiffrement par substitution classique : Il n'existe aucune table de correspondance fixe entre caractères clairs et caractères chiffrés.

4.2 Contrainte de transport

Les primitifs standards (AES-CTR, ChaCha20) produisent une sortie binaire. Leur utilisation sur un canal SMS imposerait un encodage supplémentaire (Base64, Base85) qui augmente la taille du message de 33 à 50 %. Sur SMS, chaque caractère compte.

Le cipher d'OV Message opère directement dans l'espace Unicode. Le texte clair est transformé en texte chiffré sans passer par une représentation binaire intermédiaire. Le ratio est de 1:1 — un caractère clair produit un caractère chiffré.

Le design retenu utilise SHA3-256 comme générateur pseudo-aléatoire indexé par position, avec un index aléatoire par message et une sous-clé dérivée par HKDF. Chaque caractère est chiffré indépendamment avec une entropie de 256 bits par position.

Compromis assumé : Un cipher non standard en échange d'un ratio de taille optimal sur un canal à bande passante limitée. Les primitifs standards (AES-256-GCM, HKDF-SHA256, HMAC-SHA256) sont utilisés pour toutes les autres opérations cryptographiques.

4.3 Principe de fonctionnement

  1. Normalisation du message (Unicode NFC, retours à la ligne uniformisés)
  2. Génération d'un index aléatoire (CSPRNG)
  3. Dérivation d'une sous-clé unique au message via HKDF-SHA256
  4. Dérivation d'un alphabet chiffré spécifique au contact (permutation déterministe)
  5. Chiffrement caractère par caractère — chaque position utilise SHA3-256 avec la sous-clé, la position, et l'index pour produire un index de substitution dans l'alphabet dérivé
  6. Génération du tag HMAC-SHA256 (voir section 5)
  7. Formatage du message chiffré avec l'index et le tag

Unicité garantie : Chaque message utilise une sous-clé cryptographiquement indépendante. Deux messages identiques envoyés au même contact produisent des chiffrés complètement différents.

4.4 Propriétés de sécurité

Confusion

SHA3-256 à chaque position, relation non linéaire entre clair et chiffré.

Diffusion

L'index aléatoire change l'intégralité du chiffré pour un même message.

Anti-analyse fréquentielle

Aucune correspondance fixe caractère-à-caractère.

Anti-clair connu

Sous-clé unique par message, connaître un couple (clair, chiffré) n'aide pas pour un autre message.

4.5 Alphabets

Le système utilise des alphabets Unicode conçus pour couvrir 100+ langues en entrée et produire une sortie dans un espace Unicode distinct.

5. Intégrité et authentification (HMAC)

5.1 Dérivation de la clé MAC

La clé MAC est dérivée indépendamment de la clé de chiffrement via HKDF-SHA256 avec séparation de domaine. Chaque conversation produit une clé MAC unique.

5.2 Calcul du tag

Le tag HMAC-SHA256 est calculé sur la concaténation de données authentifiées additionnelles (identifiant de conversation, index du message) et du texte chiffré. Le tag est tronqué à 128 bits.

5.3 Propriétés

Anti-falsification

Toute modification du chiffré invalide le tag.

Anti-rejeu

L'index aléatoire unique par message rend chaque tag unique.

Anti-rétrogradation

La vérification du tag est obligatoire au déchiffrement.

Séparation de domaine

La clé MAC est dérivée avec un info string différent de la clé AES des fichiers.

6. Gestion des clés

6.1 Génération des clés de contact

Chaque clé de contact est générée localement avec un CSPRNG. Les clés ont une longueur variable et une haute entropie. La longueur variable empêche un attaquant de déterminer la taille de la clé à partir de métadonnées.

6.2 Échange de clés

OV Message propose trois méthodes d'échange hors bande :

MéthodeCanalMécanisme
En personneQR code scanné physiquementTransmission directe de la clé
Par visioAppel vidéo externeECDH sur courbe X25519
Par codeVoix, texte, ou tout canalECDH sur courbe X25519

Échange ECDH : Chaque participant génère une paire de clés éphémère sur X25519. Les clés publiques sont échangées, chacun calcule le secret partagé ECDH dérivé en clé de contact via SHA3-256. Les clés privées éphémères sont détruites après l'échange.

6.3 Pool de clés pré-générées

Génération

Un pool de clés pré-généré localement pour chaque contact. Chaque clé indexée par un numéro.

Export chiffré

Pool chiffré avec AES-256-GCM (clé dérivée par HKDF-SHA256) avant échange.

Rotation

Sélection par index, seul le numéro transite. Jamais la clé elle-même.

Suppression définitive

Chaque clé consommée est physiquement supprimée, garantissant la forward secrecy.

6.4 Dérivation de clés

UsageAlgorithmeDétails
Hachage mot de passeArgon2id (m=64 Mo, t=3, p=1, L=32)Sel aléatoire par hash
KEKArgon2id (m=64 Mo, t=3, p=1, L=32)Sel séparé du hash
Clé AES fichiersHKDF-SHA256Info string dédié
Clé AES poolHKDF-SHA256Info string dédié
Clé MACHKDF-SHA256Info string dédié + ID conversation
Échange ECDHECDH X25519 + HKDF-SHA256Clés éphémères par échange
Permutation charsetDérivation déterministeEntrée différente par contact

Séparation de domaine : Chaque contexte utilise un info string ou un sel distinct, garantissant qu'une même clé de contact produit des clés dérivées indépendantes pour chaque usage.

7. Protection des clés au repos (KEK/DEK)

7.1 Objectif

Protéger les clés de contact contre l'extraction forensique (Cellebrite, JTAG, extraction RAM) en cas de saisie physique du téléphone.

7.2 Architecture

KEK (Key Encryption Key)

Dérivée du mot de passe via Argon2id (m=64 Mo, t=3, p=1). N'est jamais stockée — dérivée à la demande au login.

DEK (Data Encryption Key)

Clé aléatoire, enveloppée sous KEK via AES-256-GCM. Chargée en mémoire au login, détruite au verrouillage (kill du process).

Clés de contact

Chaque clé chiffrée individuellement avec le DEK (AES-256-GCM). Déchiffrement lazy (à la demande).

7.3 Rétrocompatibilité

Sans mot de passe configuré, les clés restent dans le keystore sécurisé (protégées par Android Keystore). La migration vers le mode chiffré est transparente à la première configuration d'un mot de passe.

8. Chiffrement des fichiers

8.1 Algorithme

Les fichiers partagés entre contacts sont chiffrés avec AES-256-GCM. La clé AES est dérivée par HKDF-SHA256 à partir de la clé de contact et d'un sel aléatoire de 16 octets, avec un info string dédié. Un IV de 12 octets est généré aléatoirement.

Overhead total : 44 octets (sel 16 + IV 12 + tag 16).

8.2 Vérifications d'intégrité

L'authentification GCM garantit l'intégrité du chiffré et de l'AAD. Une vérification de cohérence du nom de fichier est effectuée après déchiffrement.

9. Protection anti-rejeu

9.1 Conception sans horloge

Indépendant de l'horloge : Aucun horodatage, aucun TTL, aucune synchronisation requise entre appareils.

  • Chaque tag HMAC reçu (128 bits) est stocké localement.
  • Un message avec un tag déjà vu est silencieusement rejeté.
  • Le stockage est partitionné par contact et par direction (émission/réception).

9.2 Seuils d'alerte

SeuilAction
1 500 tags stockésAlerte : rotation de clé recommandée
1 800 tags stockésAlerte : rotation fortement recommandée
1 999 tags stockésAlerte : rotation urgente

9.3 Rotation de clé

À chaque rotation de clé, le magasin de rejeu est effacé. La nouvelle clé produit une nouvelle clé MAC, donc les anciens tags ne peuvent pas être rejoués.

10. Mode Forteresse (anti-phishing)

10.1 Principe

Le mode Forteresse est un filtre actif qui supprime automatiquement tout message entrant n'ayant pas pu être authentifié. Il constitue une protection contre le phishing, l'usurpation d'identité et les messages non sollicités.

10.2 Filtrage en 3 étapes

Étape 1 — Expéditeur connu

Le numéro est un contact OV Message avec une clé de chiffrement. Échec = message supprimé.

Étape 2 — Format OV

Le message est au format chiffré OV. Échec = message supprimé.

Étape 3 — Authentification

Le tag HMAC-SHA256 est valide et le déchiffrement réussit. Échec = message supprimé.

10.3 Double couche de filtrage

Couche native : intercepte les messages avant diffusion au système. Les numéros inconnus sont bloqués immédiatement, sans notification.

Couche applicative : validation cryptographique complète (HMAC + déchiffrement) pour les messages ayant passé le premier filtre.

10.4 Notifications anonymisées

En mode Forteresse, les notifications sont génériques (aucun nom d'expéditeur, aucun aperçu du contenu). Un attaquant observant l'écran de verrouillage ne peut pas déterminer qui communique avec l'utilisateur.

11. Résilience forensique

11.1 Mode Panic

Deux niveaux de destruction d'urgence. Déclenchement par mot de passe alternatif dédié. Si l'auto-destruction est activée, 3 échecs de mot de passe déclenchent automatiquement le mode Panic.

DonnéePanic (destruction complète)Panic clés (clés uniquement)
Clés de contactDétruitesDétruites
DEK / KEKDétruitsDétruits
SMS physiquesSupprimésPréservés
Contacts du répertoireSupprimésPréservés
Conversations, paramètresEffacésPréservés
Messages chiffrésSupprimésPrésents mais indéchiffrables
Caches mémoire (RAM)Écrasés puis vidésVidés
RéversibilitéNonNon

Indétectable : Les deux modes sont silencieux — aucune alerte visuelle, l'application affiche l'écran principal comme après un login normal.

11.2 Auto-lock natif (kill du process)

Un module natif programme la terminaison du process via une alarme système exacte, immune au Doze mode. Quand le timer expire, le process est tué par l'OS et toute la RAM est libérée (DEK, clés, données sensibles). Si l'application revient en premier plan avant l'expiration, l'alarme est annulée.

11.3 Protections complémentaires

Anti-screenshot

Flag système empêchant la capture d'écran et l'enregistrement.

Anti-backup cloud

Backup désactivé sur tous les domaines (cloud, local, transfert).

Stockage sécurisé

Android Keystore pour les secrets (extraction requiert le PIN/biométrie).

12. Limites connues et compromis

12.1 Pas de Perfect Forward Secrecy

L'application fonctionne sans serveur d'échange de clés permanent, rendant le Double Ratchet impraticable. Un hash ratchet causerait une désynchronisation sur les messages perdus ou réordonnés.

Sécurité en mode clé statique : Chaque message dérive une sous-clé indépendante via HKDF-SHA256. La compromission d'une sous-clé ne compromet pas les autres messages. Le pool de clés apporte une forward secrecy manuelle — la suppression d'une clé consommée rend les messages passés indéchiffrables.

12.2 Métadonnées de transport

Le canal de transport expose des métadonnées (expéditeur, destinataire, horodatage). OV Message ne peut pas masquer ces informations car elles font partie du protocole de transport sous-jacent.

12.3 Padding

Les messages sont paddés de manière déterministe. Un observateur peut approximer la longueur du message clair. Ce compromis est accepté car les métadonnées de transport fuient déjà plus d'informations que la longueur du message.

12.4 Statut d'audit

Audit : Le cipher par flux basé sur SHA3-256 est un design original dont la sécurité repose sur les propriétés PRF bien établies de SHA3-256. Un audit cryptographique formel indépendant est planifié et sera publié. Toutes les autres opérations cryptographiques utilisent des primitifs standards audités.

12.5 Échange de clés initial

La sécurité repose sur la confidentialité de la clé partagée. L'échange en personne (QR code) ou par visio (ECDH) constitue une vérification d'identité directe. L'échange par code vocal repose sur la reconnaissance vocale, qui est moins fiable.

13. Positionnement

OV Message cible un modèle de menace que les messageries conventionnelles (Signal, WhatsApp, Olvid) n'adressent pas : fonctionnement sans serveur ni connexion Internet, résilience à la saisie physique du téléphone, et destruction d'urgence des données sous contrainte.

Mode Panic multicouche

Destruction complète ou clés uniquement, indétectable par l'attaquant.

Auto-lock natif

Terminaison du process, libération de la RAM par l'OS.

Mode Forteresse

Filtrage anti-phishing en 3 étapes avec notifications anonymisées.

Pérennité

Zéro coût d'infrastructure, aucune dépendance à un tiers, résistant à la censure.

14. Synthèse des paramètres cryptographiques

ComposantParamètreValeur
Chiffrement messagesHash par positionSHA3-256 (256 bits)
Chiffrement messagesIndex aléatoireHaute entropie (CSPRNG)
Chiffrement messagesSous-clé par messageHKDF-SHA256 (256 bits)
Chiffrement messagesAlphabetsDérivés par contact
HMACAlgorithmeHMAC-SHA256
HMACTag128 bits
HMACDérivationHKDF-SHA256 avec séparation de domaine
Argon2idMémoire (m)64 Mo
Argon2idItérations (t)3
Argon2idParallélisme (p)1
Argon2idSortie256 bits
AES-256-GCMClé256 bits
AES-256-GCMIV96 bits
AES-256-GCMTag128 bits
KEK/DEKDEK256 bits aléatoires
KEK/DEKEnveloppementAES-256-GCM sous KEK
Génération de clésEntropieHaute entropie (CSPRNG)
ECDHCourbeX25519 (128 bits de sécurité)
ECDHClés éphémèresDétruites après échange
Anti-rejeuStockagePar contact, par direction
FichiersChiffrementAES-256-GCM + HKDF

OV Message — Chiffrement sans serveur, sans dépendance, sans concession sur la sécurité.