Alice wants to send Bob a secret key, and Eve wants to listen in. Alice sends each bit as a particle of light, set with one of two filters: + makes a 0 point → and a 1 point ↑, while × makes a 0 point ↗ and a 1 point ↖.
Bob guesses a filter for each one. When he guesses Alice's filter he reads the bit correctly; when he doesn't, he gets a coin flip. Afterwards they compare filters out loud, never the bits, and keep only the columns where the filters matched.
The catch for Eve is that looking at a particle changes it. She has to guess filters too, and her wrong guesses leave errors behind. So Alice and Bob sacrifice a few kept bits and compare them: any mismatch means someone was listening. Switch Eve on and see.
This is BB84 as my Python program does it, with Qiskit on a quantum simulator: you set Alice's message and whether Eve is listening, and it reports how similar Bob's reading is. In my version even the random filter choices come from a quantum circuit. I built it with help from my advisor, Zaniar Ghadernezhad. Here your browser plays all three parts.