everyone on the way
reads a postcard.
image: ai-generated (gpt-image-2)

the third sensor

whatever your sensor sees, the sensor next to it sees too.

encryption as a box, twice

everyone may see the message. nobody but you may understand it.

you have seen this gate

xor: 1 when the two differ. that is all we need.

xor with a key byte

where the key has a 1, the bit flips. the result looks like any old byte.

do it again, get it back

encrypt and decrypt are the same operation with the same key.
the key of all zeros
key 0000 0000: nothing flips.
the program runs, the transmission works, and you are sending plaintext without noticing. look at the bytes that actually go out.

what it looks like in the file

same length, same number of bytes, not one of them readable.

try it: scramble your own text

your spec may say xor. it must not say the key.
the method: public. every team reads it, and that is fine.
the key: secret. it is the only thing that must be.
kerckhoffs, 1883. your browser encrypts with methods from the textbook.

one byte of key: 256 tries

looking like noise is not the same as being noise.

why longer is better

every byte of key multiplies the work by 256. that is why keys are long.
a billion tries a second: the order of one graphics card

your password is a key

length beats symbols. and a word from a list is no key at all.
same billion tries a second · check your own on haveibeenpwned.com

three bytes of key, and the parrot is still there

raw196 608 bytes, what you want to send
xor with 5a c3 96, repeatedwhat the neighbours display
encrypted is not the same as unrecognisable.
real files, 256 × 256 points · parrot: ai-generated (gpt-image-2)

why the pattern survives

a short key treats equal bytes equally. the picture keeps its shape.

a key as long as the picture, used once

three bytes, repeated65 536 times
196 608 random bytes, used oncenothing repeats, nothing shows
now it is noise. provably. and it has a price.
real files, 256 × 256 points · parrot: ai-generated (gpt-image-2)

how the key gets to your partner

the key must travel. and it must not travel on the link.

strangers: a padlock instead of a slip of paper

a lock anyone can shut and only one can open: the secret travels locked, the key never travels.
diffie and hellman, 1976

flipped bits go straight through

a key keeps others from reading. it does not keep bits from changing.

what stays in the clear

encrypt the content. the frame around it has a job to do.

pack first, then lock

encrypted bytes have no redundancy left. pack before you lock.
measured 14 sept 2026, python zipfile level 9, one-time key on the raw parrot

hide it in the parrot

the parrot196 608 bytes
the parrot + 24 576 characters of hidden text196 608 bytes, 98 556 of them changed by exactly 1
not scrambled. hidden, in the bit nobody looks at.
real files, 256 × 256 points · parrot: ai-generated (gpt-image-2)

the lowest bit, made visible

lowest bit of red, originalnoise with traces of the picture
the same bit with the text insidethe stripes of ascii, to the naked eye
256 × 256 × 3 = 196 608 values · 1 bit each · ÷ 8 = 24 576 characters
whoever knows where to look reads it in a blink. hidden is not secret.
hidden is not secret. secret is not hidden.
encryption: everyone sees a message, nobody can read it.
steganography: nobody sees a message, anyone who looks can read it.
want both? encrypt first, then hide. the finder reads noise, and noise was there before.

today

1 light is public. the key is what protects the content.
2 xor with the key, twice, and the message is back.
3 the method may be known. the key must not, and it must be long.
4 the key needs a second path: a table, or a padlock.
5 a key stops reading, not changing: keep the checksum. pack first, then lock.
readable by everyone.
understood by one.
image: ai-generated (gpt-image-2)