CBC Padding Oracle Attack — Query Lattice (2D)
Interactive 2D simulator of the CBC padding-oracle attack that broke TLS record-layer encryption (BEAST/POODLE/Lucky13-class), running against REAL AES-128-CBC encryption (Web Crypto's crypto.subtle) instead of a toy cipher: watch the 256x16 oracle-query lattice fill in live as each byte of a genuine ciphertext block is recovered using only padding-valid/invalid responses.
Before TLS 1.3, browsers negotiated CBC-mode block ciphers whose record layer decrypted each 16-byte block as DK(Ci) ⊕ Ci−1 and then stripped PKCS#7 padding — and if a server ever signalled, even indirectly through timing, whether that padding came out valid, it handed an attacker a one-bit oracle per query. This simulator runs the attack for real: it generates a fresh AES-128 key with crypto.subtle.generateKey, encrypts a random 16-byte secret block with a random IV, and then recovers that secret byte-by-byte using nothing but padding-valid/invalid responses from crypto.subtle.decrypt — the same primitive a real vulnerable TLS server exposes. The 2D lattice renders the actual 256-guess search at every byte position as it happens, so the fill pattern you see is the real geometric query-cost distribution, not a canned animation. Switch to AEAD/GCM to see why the same attack is instantly rejected: authenticated encryption checks the integrity tag before touching the padding at all, which is exactly why TLS 1.3 made AEAD ciphers mandatory and dropped CBC suites entirely.
Watch the real 256x16 oracle-query search lattice fill in live as a genuine AES-128-CBC ciphertext block (encrypted in-browser with crypto.subtle) is recovered byte-by-byte using only padding-valid/invalid responses — the same algorithm behind BEAST/POODLE/Lucky13 — then switch to AEAD/GCM to see why authenticated encryption blocks the attack outright.
2D · HTML5 Canvas 2D · 60 FPS target · runs fully client-side, no install