220 lines
9.1 KiB
HTML
220 lines
9.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>SIGNAL_STREAM_FINAL</title>
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Orbitron:wght@500;700&display=swap');
|
|
|
|
:root {
|
|
--neon: #00ff9f;
|
|
--magenta: #ff007a;
|
|
--bg: #01050a;
|
|
}
|
|
|
|
body, html {
|
|
margin: 0; padding: 0; width: 100%; height: 100%;
|
|
background: var(--bg); color: var(--neon);
|
|
font-family: 'Share Tech Mono', monospace; overflow: hidden;
|
|
}
|
|
|
|
/* L'espace 3D */
|
|
#stage {
|
|
width: 100vw; height: 100vh;
|
|
perspective: 1200px;
|
|
display: flex; justify-content: center; align-items: center;
|
|
}
|
|
|
|
#world {
|
|
position: relative; width: 100%; height: 100%;
|
|
transform-style: preserve-3d;
|
|
transition: transform 1s cubic-bezier(0.19, 1, 0.22, 1);
|
|
}
|
|
|
|
/* Design des Slides */
|
|
.slide {
|
|
position: absolute;
|
|
width: 800px; min-height: 450px;
|
|
left: 50%; top: 50%;
|
|
margin-left: -400px; margin-top: -225px; /* Centrage précis */
|
|
background: rgba(2, 12, 20, 0.95);
|
|
border: 1px solid rgba(0, 255, 159, 0.3);
|
|
padding: 40px; box-sizing: border-box;
|
|
opacity: 0.15;
|
|
transform: translateZ(-500px) rotateY(20deg); /* Position de repos "lointaine" */
|
|
transition: all 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
pointer-events: none;
|
|
box-shadow: 0 0 30px rgba(0,0,0,0.5);
|
|
}
|
|
|
|
/* La slide active vient sur le devant de la scène */
|
|
.slide.active {
|
|
opacity: 1;
|
|
transform: translateZ(200px) rotateY(0deg) rotateX(0deg);
|
|
border-color: var(--neon);
|
|
box-shadow: 0 0 50px rgba(0, 255, 159, 0.2);
|
|
pointer-events: auto;
|
|
z-index: 100;
|
|
}
|
|
|
|
/* Titres et contenus */
|
|
h2 { font-family: 'Orbitron', sans-serif; color: white; border-left: 4px solid var(--magenta); padding-left: 15px; }
|
|
.highlight { color: var(--magenta); }
|
|
.dim { opacity: 0.6; font-size: 0.9rem; }
|
|
|
|
table { width: 100%; border-collapse: collapse; margin-top: 15px; font-size: 0.8rem; }
|
|
th, td { border: 1px solid rgba(0, 255, 159, 0.2); padding: 8px; text-align: left; }
|
|
|
|
/* Décorations de fond */
|
|
.bg-element {
|
|
position: absolute; border: 1px solid var(--neon); opacity: 0.1; pointer-events: none;
|
|
}
|
|
|
|
#nav {
|
|
position: fixed; bottom: 30px; width: 100%; text-align: center;
|
|
font-size: 0.8rem; letter-spacing: 2px; opacity: 0.6;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div id="stage">
|
|
<div id="world">
|
|
|
|
<div class="slide active" id="s0">
|
|
<p class="highlight">// BOOT_PROTOCOL_ANALYSIS</p>
|
|
<h2>MESSAGERIE SÉCURISÉE</h2>
|
|
<p><strong>C.I.D.A :</strong> Confid. / Intégrité / Auth. / Dispo.</p>
|
|
<div style="margin-top:30px; border: 1px dashed var(--neon); padding: 15px;">
|
|
<p>> PFS (Confidentialité Persistante)<br>
|
|
> Auto-guérison (Double Ratchet)<br>
|
|
> Déniabilité & Asynchronisme</p>
|
|
</div>
|
|
<p class="dim" style="margin-top:40px;">TELECOM NANCY // TOM // 2026</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s1">
|
|
<h2>HISTORIQUE : L'ÈRE DU CLAIR</h2>
|
|
<p><span class="highlight">1982 - SMTP :</span> "Hop-by-Hop". Chaque serveur lit le contenu.</p>
|
|
<p><span class="highlight">1992 - SMS :</span> Stockage en clair dans le SMSC opérateur. <br>Accès total pour Orange / SFR / AT&T.</p>
|
|
<p><span class="highlight">2008-2020 - RCS :</span> Evolution multimédia. E2EE imposé par Google en 2020. Problèmes d'interopérabilité.</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s2">
|
|
<h2>PGP (1991) vs OTR (2004)</h2>
|
|
<p><strong>PGP :</strong> E2EE asynchrone. Crypto = "Arme".<br>
|
|
<span class="highlight">LIMITE :</span> Pas de PFS. Clé compromise = Passé compromis.</p>
|
|
<hr style="opacity:0.2; margin:20px 0;">
|
|
<p><strong>OTR :</strong> Ajoute la PFS et la Déniabilité.<br>
|
|
<span class="highlight">ÉCHEC :</span> Protocole SYNCHRONE. Les deux doivent être en ligne. "Session Broken" sur mobile.</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s3">
|
|
<h2>2013 : RÉVOLUTION SIGNAL</h2>
|
|
<p>Le meilleur d'OTR (PFS) + Le meilleur de PGP (Async).</p>
|
|
<ul>
|
|
<li><strong>X3DH :</strong> Échange de clés asynchrone via Pre-keys.</li>
|
|
<li><strong>Double Ratchet :</strong> Clé renouvelée à chaque message.</li>
|
|
<li><strong>Résilience :</strong> Remet les messages dans l'ordre.</li>
|
|
</ul>
|
|
<p class="dim">Adopté par WhatsApp, Google Messages, Skype.</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s4">
|
|
<h2>BENCHMARK SÉCURITÉ</h2>
|
|
<table>
|
|
<tr><th>Critère</th><th>SMS</th><th>PGP</th><th>OTR</th><th>Signal</th></tr>
|
|
<tr><td>E2EE</td><td>❌</td><td>✅</td><td>✅</td><td>✅</td></tr>
|
|
<tr><td>PFS</td><td>❌</td><td>❌</td><td>✅</td><td>✅</td></tr>
|
|
<tr><td>Async</td><td>✅</td><td>✅</td><td>❌</td><td>✅</td></tr>
|
|
<tr><td>Auto-heal</td><td>❌</td><td>❌</td><td>❌</td><td>✅</td></tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="slide" id="s5">
|
|
<h2>CŒUR TECHNIQUE (X3DH)</h2>
|
|
<p style="text-align:center; font-size: 6rem; margin:20px 0;">🦦</p>
|
|
<p style="text-align:center;">[ DÉMONSTRATION AU TABLEAU ]</p>
|
|
<p class="dim" style="text-align:center;">Analyse du Double Ratchet & des Pre-keys</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s6">
|
|
<h2 class="highlight">VULNÉRABILITÉS & FUTUR</h2>
|
|
<p><strong>Quantique :</strong> Menace sur ECDH. Signal déploie <span class="highlight">PQXDH</span>.</p>
|
|
<p><strong>Endpoints :</strong> Pegasus/Spywares. Si l'OS est corrompu, la crypto ne sert à rien.</p>
|
|
<p><strong>MitM :</strong> Risque de fausse clé publique. <br>Solution : Safety Numbers.</p>
|
|
</div>
|
|
|
|
<div class="slide" id="s7">
|
|
<h2>SOUVERAINETÉ : MATRIX VS DISCORD</h2>
|
|
<p><strong>Discord :</strong> Centralisé. Non-E2EE (Modération). Métadonnées exploitées.</p>
|
|
<p><strong>Matrix :</strong> Fédéré. E2EE par défaut. Utilisé par l'État (Tchap). Souveraineté totale.</p>
|
|
<div style="border:1px solid var(--magenta); padding:10px; margin-top:20px; text-align:center;">
|
|
CONCLUSION : La sécurité est un équilibre.
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="nav">ESPACE / FLÈCHES POUR NAVIGUER</div>
|
|
|
|
<script>
|
|
let current = 0;
|
|
const slides = document.querySelectorAll('.slide');
|
|
const world = document.getElementById('world');
|
|
|
|
// On disperse les slides de manière déstructurée au début
|
|
slides.forEach((s, i) => {
|
|
if(i !== 0) {
|
|
const rx = (Math.random() - 0.5) * 1000;
|
|
const ry = (Math.random() - 0.5) * 1000;
|
|
const rz = -1000 - (Math.random() * 500);
|
|
const rot = (Math.random() - 0.5) * 60;
|
|
s.style.transform = `translate3d(${rx}px, ${ry}px, ${rz}px) rotateZ(${rot}deg)`;
|
|
}
|
|
});
|
|
|
|
function nextSlide() {
|
|
slides[current].classList.remove('active');
|
|
// On renvoie la slide actuelle dans le décor avec un angle aléatoire
|
|
const rx = (Math.random() - 0.5) * 1000;
|
|
const ry = (Math.random() - 0.5) * 1000;
|
|
const rot = (Math.random() - 0.5) * 45;
|
|
slides[current].style.transform = `translate3d(${rx}px, ${ry}px, -1000px) rotateZ(${rot}deg)`;
|
|
|
|
current = (current + 1) % slides.length;
|
|
|
|
slides[current].classList.add('active');
|
|
// Le style "active" dans le CSS va forcer la slide à revenir au centre (0,0,200px)
|
|
}
|
|
|
|
function prevSlide() {
|
|
slides[current].classList.remove('active');
|
|
const rx = (Math.random() - 0.5) * 1000;
|
|
const ry = (Math.random() - 0.5) * 1000;
|
|
slides[current].style.transform = `translate3d(${rx}px, ${ry}px, -1000px)`;
|
|
|
|
current = (current - 1 + slides.length) % slides.length;
|
|
slides[current].classList.add('active');
|
|
}
|
|
|
|
window.addEventListener('keydown', e => {
|
|
if(e.key === 'ArrowRight' || e.key === ' ') nextSlide();
|
|
if(e.key === 'ArrowLeft') prevSlide();
|
|
});
|
|
|
|
// Éléments de fond aléatoires
|
|
for(let i=0; i<20; i++) {
|
|
const el = document.createElement('div');
|
|
el.className = 'bg-element';
|
|
el.style.width = Math.random() * 200 + 'px';
|
|
el.style.height = Math.random() * 200 + 'px';
|
|
el.style.left = Math.random() * 100 + '%';
|
|
el.style.top = Math.random() * 100 + '%';
|
|
el.style.transform = `translateZ(-800px)`;
|
|
world.appendChild(el);
|
|
}
|
|
</script>
|
|
</body>
|
|
</html> |