// Encryption info modal — pédagogique, animé, montre le flux zero-knowledge. const EncryptionModal = ({ open, onClose }) => { const [step, setStep] = React.useState(0); const [autoplay, setAutoplay] = React.useState(true); React.useEffect(() => { if (!open) { setStep(0); setAutoplay(true); return; } if (!autoplay) return; const t = setInterval(() => setStep(s => (s + 1) % 4), 2200); return () => clearInterval(t); }, [open, autoplay]); if (!open) return null; return (
e.stopPropagation()}>

Chiffrement de bout en bout

Vos données sont illisibles, même pour nous.

setAutoplay(false)}>
= 1} label="Argon2id" /> = 2} label="AES-256-GCM" /> = 3} label="HTTPS / TLS 1.3" />
{[0,1,2,3].map(i => (
{step === 0 && (

Votre mot de passe maître reste sur votre appareil. Il ne quitte jamais votre navigateur — pas même chiffré.

)} {step === 1 && (

Argon2id (lauréat de la Password Hashing Competition) le transforme en clé robuste, résistante aux GPU et ASIC. Paramètres : t=3, m=64 Mo, p=1.

)} {step === 2 && (

Vos mots de passe sont chiffrés localement avec AES-256-GCM. Chaque entrée a son propre IV. Authentification intégrée.

)} {step === 3 && (

Le serveur ne reçoit que des blobs chiffrés. Une faille de notre BDD ne révélerait que du bruit. C'est le principe zero-knowledge.

)}
); }; const stageTone = { indigo: { bg: 'rgba(99,102,241,.15)', fg: '#A5B4FC' }, rose: { bg: 'rgba(236,72,153,.15)', fg: '#F9A8D4' }, emerald: { bg: 'rgba(16,185,129,.15)', fg: '#6EE7B7' }, slate: { bg: 'rgba(148,163,184,.15)', fg: '#CBD5E1' }, }; const Stage = ({ active, icon, title, sub, tone }) => { const t = stageTone[tone]; return (
{icon === 'cloud' ? ( ) : ( )}
{title}
{sub}
); }; const Arrow = ({ active, label }) => (
{label}
); const Pillar = ({ title, desc }) => (
{title}
{desc}
); window.EncryptionModal = EncryptionModal;