1. Identité
Alethea repose sur une identité numérique vérifiée par un tiers de confiance. Le protocole est identity-provider-agnostic : il accepte plusieurs sources d'attestation, pourvu qu'elles satisfassent un niveau eIDAS reconnu. Cinq niveaux sont définis.
| Niveau | Description | Providers de référence |
|---|---|---|
| 0 | Anonyme (vérification seule, signature interdite) | — |
| 1 | Email + téléphone vérifiés | OAuth2 providers majeurs |
| 2 | KYC standard (pièce d'identité + selfie) | Onfido, Sumsub, Veriff |
| 3 | KYB pour entités juridiques | Sumsub Corporate, KYC-Chain |
| 4 | eIDAS qualifié / souverain | FranceConnect+, eID-AS niveau élevé |
L'identité reste privée. Seul un identityHash = SHA-256(provider || providerUserId || salt) est publié sur le registre, lié à la clé publique du signataire. Le provider conserve la correspondance, divulgable uniquement sur réquisition judiciaire selon ses propres CGU.
2. Empreintes de contenu
Tout contenu signé produit plusieurs empreintes calculées côté client. Le contenu lui-même n'est jamais transmis ni au protocole ni au registre.
- SHA-256 : hash exact. Permet de retrouver une copie strictement identique au bit près.
- pHash perceptuel : hash perceptuel image. Résiste aux recompressions, redimensionnements, modifications colorimétriques mineures.
- Chromaprint : fingerprinting audio. Très robuste aux altérations.
- Hash par segments : pour la vidéo, découpée en blocs (1 frame par seconde, 4 à 60 frames). Permet de retrouver des fragments même après trim ou montage.
async function computeContentHash(file) {
const buffer = await file.arrayBuffer();
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
return Array.from(new Uint8Array(hashBuffer))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}3. Signature cryptographique
Schémas supportés en v0.1 : ECDSA secp256k1 (compatibilité Ethereum-family) et Ed25519 (compatibilité Solana, plus rapide).
struct AletheaSignature {
bytes32 contentHash; // SHA-256 du contenu
bytes32 perceptualHash; // pHash ou hash composite
address signerAddress; // clé publique
bytes32 identityHash; // hash de l'identité vérifiée
uint8 role; // 1..5 (Auteur..Reclaim)
uint8 identityLevel; // 0..4 (cf. spec section 1)
uint64 timestamp; // unix seconds, posé on-chain
bytes32 contextHash; // hash JSON contexte additionnel
bytes signature; // ECDSA/Ed25519
}Flow de signature
4. Registre (chain-agnostic)
Le protocole ne prescrit pas de blockchain unique. Il définit la structure d'une signature et le shape d'un registry. Toute infrastructure remplissant ces critères peut héberger un registre Alethea.
Critères d'éligibilité d'un registre :
- Public et consultable sans autorisation.
- Immuable (write-once, append-only).
- Horodatage vérifiable (timestamp posé par le registre).
- Censure-résistant (aucun acteur unique ne peut effacer).
- Coût de transaction raisonnable (cible : moins de 0,01 € par signature).
Des profils Alethea sont publiés par registre supporté, sur le modèle des profils C2PA. Profils en cours de rédaction :
- · Alethea on Polygon (référence v0.1, rapport coût/perf le plus favorable)
- · Alethea on Base (alternative L2 Ethereum)
- · Alethea on Ethereum L1 (cas haute valeur juridique, coût élevé)
- · Alethea on Solana (cas haute fréquence, Ed25519 natif)
D'autres profils peuvent être proposés par RFC ouvert, y compris sur des registres non-blockchain satisfaisant les critères (modèle Sigstore / transparency log type Certificate Transparency).
5. Vérification
L'algorithme de vérification est multi-niveaux. Il cherche d'abord une correspondance exacte (SHA-256), puis perceptuelle (pHash, distance de Hamming), puis segmentée (alignement par fenêtre glissante pour les vidéos).
def sliding_min_avg_distance(short, longer):
"""Cherche le meilleur alignement de la séquence courte
dans la longue. Tolère trims, recompressions, ré-encodages."""
if len(short) > len(longer):
short, longer = longer, short
n, m = len(short), len(longer)
best_avg, best_offset = None, 0
for i in range(m - n + 1):
total = sum(short[j] - longer[i + j] for j in range(n))
avg = total / n
if best_avg is None or avg < best_avg:
best_avg, best_offset = avg, i
return float(best_avg), best_offsetSeuil par défaut de la distance de Hamming : 8 (configurable). Au-delà, pas de match. En deçà, la signature correspondante est renvoyée avec son offset temporel pour les vidéos.
6. Interopérabilité
Alethea s'inscrit dans l'écosystème provenance existant. Position : couche d'identité et de réfutation au-dessus des standards de provenance, pas concurrent.
- C2PA : compatibilité native prévue. Une signature Alethea peut être embarquée dans un manifest C2PA via une assertion custom
org.aletheaprotocol.signature. - eIDAS : mapping direct du niveau d'identité Alethea vers les niveaux eIDAS (substantiel, élevé). Une signature niveau 4 satisfait les exigences d'identification forte.
- JSON-LD : format canonique d'export d'une signature. Contexte
https://aletheaprotocol.com/context/v1, schémas conformes Schema.org pour ClaimReview et MediaObject.
7. Robustesse aux modifications
Tableau des scénarios courants et de la résilience attendue de la vérification.
| Scénario | SHA-256 | pHash | Segmenté + sliding |
|---|---|---|---|
| Copie strictement identique | ✓ | ✓ | ✓ |
| Recompression JPEG / H.264 | ✗ | ✓ | ✓ |
| Redimensionnement | ✗ | ✓ | ✓ |
| Ajustement luminosité / contraste | ✗ | ✓ | ✓ |
| Crop léger (<10%) | ✗ | ~ | ✓ |
| Crop massif (>30%) | ✗ | ✗ | ~ |
| Rotation 90°+ | ✗ | ✗ | ~ |
| Trim vidéo (extrait) | ✗ | ✗ | ✓ |
| Concat avec autre contenu | ✗ | ✗ | ✓ (sur segments matchés) |
Légende : ✓ détection fiable. ~ détection partielle, dépend du seuil. ✗ non détectable.