KryptBoard live demo

What you are looking at

This page loads the same modules the browser extension injects (src/keyboard.js, src/wiring.js, src/crypto.js) over a normal HTTP origin — the extension ships them as a content script instead. Everything below is real: the keys, the buffer, the AEAD seal, the envelope, the target tracking.

Press Ctrl+Shift+K to toggle the keyboard, or click “Open keyboard”. In Encrypted mode keystrokes stay in the overlay and only the sealed envelope is committed to the field below — watch the page-side log to see exactly what the page receives. Press ⌨ Capture in the overlay's toolbar and type on your physical keyboard: every keystroke lands in the buffer and the page log stays empty.

1 · A field for the keyboard to type into

Rich text (contenteditable)
Edit me…

2 · Page-side log — what the page actually receives

Each entry is emitted by ordinary DOM events on this page. In encrypted mode you should only ever see v1|CHACHA20-POLY1305|… envelopes, never your keystrokes.

    3 · Round-trip: decrypt an envelope locally

    Paste an envelope produced above, add the passphrase, and recover the plaintext — the same operation the Android crypto-lib performs on a phone.

    no session key
    The paper's model: one key, generated here, never derived from a passphrase. Share the kbk1.… string with the recipient out of band, then paste either form back into the box above — a dictionary needs no passphrase at all.

    4 · Envelope format

    v1|CHACHA20-POLY1305|<12-byte nonce>|<ciphertext>|<16-byte tag>   (all base64url, unpadded)
    Fixed nonces are for test vectors only — the extension always draws a fresh random nonce.