# VIC-cijfer

Het VIC-cijfer (cipher) is een ingewikkeld cipher gebruikt door de Russische spion Reino Häyhänen, codenaam "VICTOR".
Het is een van de ingewikkeldste handgeschreven ciphers ooit waargenomen. Zeker niet zo complex en veilig als moderne computergegenereerde stream ciphers of block ciphers, maar sinds VIC gebruikt werd om berichten te coderen vanaf 1953, hebben de NSA en vermoedelijk andere organisaties het niet kunnen kraken. De werking van het algoritme is dan ook pas in 1957, toen Häyhänen overliep naar Amerika, uitgelegd aan de FBI.
Het VIC-cijfer begint met een vereiste procedure om tien pseudowillekeurige getallen te genereren. De spion moet zes cijfers onthouden (te denken valt aan een datum) en de eerste 20 letters van een zin. Vervolgens moet de spion vijf willekeurige cijfers bedenken om te gebruiken als berichtindicator.

## Demonstratie

Laat de datum 12 januari 2008 zijn, resulterend in 11208. En laat de willekeurige indicator 13681 zijn.
Allereerst worden de cijfers van de datum afgetrokken van de cijfers van de indicator. Indien de uitkomst van een aftrekking een negatief resultaat oplevert, dan wordt er 10 bij opgeteld (bijvoorbeeld: 7 - 5 = 2, maar 5 - 7 = -2, dus 5 - 7 = 8).
* 13681
* 11208-
* 02483
De tweede stap is, om de 20 letters uit de zin te nemen en deze in twee helften te verdelen, zodat er twee reeksen van 10 letters ontstaan. Vervolgens dienen de letters per reeks voorzien te worden van de cijfers 1, 2, 3 tot en met 0 door de letters te nummeren op volgorde van het alfabet. Gelijke letters worden genummerd van links naar rechts. Dus bijvoorbeeld de zin “het witte monster is lief” (bestaande uit 21 letters) resulteert in:
| H | E | T | W | I | T | T | E | M | O | N | S | T | E | R | I | S | L | I | E |
| 3 | 1 | 7 | 0 | 4 | 8 | 9 | 2 | 5 | 6 | 6 | 8 | 0 | 1 | 7 | 3 | 9 | 5 | 4 | 2 |
Het resultaat uit de eerste stap wordt uitgebreid tot tien nummers door een proces dat "chain addition" wordt genoemd. Dit werkt op onderstaande manier. De beginreeks wordt overgenomen 02483 en vervolgens uitgebreid met:
| | Resultaat |
| 0 + 2 = 2 | 024832 |
| 2 + 4 = 6 | 0248326 |
| 4 + 8 = 12 | 02483262 |
| 8 + 3 = 11 | 024832621 |
| 3 + 2 = 5 | 0248326215 |
Dit resultaat wordt opgeteld bij de eerste reeks van tien cijfers uit de zin.
* 3170489256
* 0248326215+
* 3318705461
Vervolgens wordt de tweede reeks cijfers uit de zin genomen en worden deze cijfers geassocieerd met de cijfers uit de reeks van de zin. Vervolgens wordt de zojuist gevonden cijferreeks omgezet tot het overeenkomstige cijfer uit de tweede reeks.
| Gebruikt | 1234567890 | |
| | 6801739542 | tweede cijferreeks uit de zin |
| Wordt | 3318705461 | uitkomst zojuist berekend |
| | 0065927136 | (3 komt overeen met 0, 1 komt overeen met 6 etc.) |
Deze uitkomst wordt vervolgens gebruikt om door middel van "chain addition" (die ook eerder gebruikt is) 50 pseudowillekeurige getallen te creëren (0 + 0 = 0, 0 + 6 = 6, 6 + 5 = 1 (wordt 1 vanwege geen tientallen) etc.).
| 0 | 0 | 6 | 5 | 9 | 2 | 7 | 1 | 3 | 6 |
| 0 | 6 | 1 | 4 | 1 | 9 | 8 | 4 | 9 | 6 |
| 6 | 7 | 5 | 5 | 0 | 7 | 2 | 3 | 5 | 2 |
| 3 | 2 | 0 | 5 | 7 | 9 | 5 | 8 | 7 | 5 |
| 5 | 2 | 5 | 2 | 6 | 4 | 3 | 5 | 2 | 0 |
| 7 | 7 | 7 | 8 | 0 | 7 | 8 | 7 | 2 | 7 |
De laatste rij van deze getallen wordt gebruikt voor transpositie om een permutatie van de cijfers 1 t/m 9 (met 0 als laatste) te kunnen uitvoeren.
* 7778078727
* 2348059617
Deze cijferreeks wordt vervolgens gebruikt om het onderstaande “schaakbord” te produceren, die nodig is voor het coderen van de berichten. Voor dit “schaakbord” wordt een simpele korte zin (zorg vies) gekozen, met letters die maar één keer voor mogen komen.
| | 2 | 3 | 4 | 8 | 0 | 5 | 9 | 6 | 1 | 7 |
| | Z | O | R | G | | V | I | E | S | |
| 0 | A | B | C | D | F | H | J | K | L | M |
| 7 | N | P | Q | T | U | W | X | Y | . | / |
Met het schaakbord gereed kunnen we beginnen met het coderen van een bericht. Na iedere niet voorkomende letter in de zin “ZORG VIES” komt er een spatie met het bijbehorende getal. Bijvoorbeeld D komt niet voor en wordt 0, vervolgens wordt er gekeken in het bord en is te zien dat D bijbehorend getal 8 heeft die de spatie wordt. Als we kiezen voor het bericht: “De strepen van een zebra zorgen voor verkoeling”.
Converterend naar nummers wordt dit het bericht:
| D | | E | S | T | | R | E | P | | E | N | | V | A | | N | | E | E | N | | Z | E | B | | R | A | | Z | O | R | G | E | N | | V | O | O | R | V | E | R | K | | O | E | L | | I | N | | G |
| 0 | 8 | 6 | 1 | 7 | 8 | 4 | 6 | 7 | 3 | 6 | 7 | 2 | 5 | 0 | 2 | 7 | 2 | 6 | 6 | 7 | 2 | 2 | 6 | 0 | 3 | 4 | 0 | 2 | 2 | 3 | 4 | 8 | 6 | 7 | 2 | 5 | 3 | 3 | 4 | 5 | 6 | 4 | 0 | 6 | 3 | 6 | 0 | 1 | 9 | 7 | 2 | 8 |
In dit voorbeeld geven we de spion een klein “persoonlijk nummer” 8. Dit nummer wordt gebruikt om de breedte te bepalen van de twee transpositietabellen die gebruikt worden voor het herschikken van deze getallen. De laatste twee ongelijke getallen (2 en 7) van de laatste rij van de 50 eerder gegenereerde getallen worden opgeteld bij het persoonlijk nummer met het resultaat dat de twee kolommen uit de herschikkingtabellen 8 + 2 = 10 en 8 + 7 = 15 worden.
Onderstaand de al eerder gegeneerde tabel, waarvan de laatste twee ongelijke getallen genomen worden.
| 0 | 0 | 6 | 5 | 9 | 2 | 7 | 1 | 3 | 6 |
| 0 | 6 | 1 | 4 | 1 | 9 | 8 | 4 | 9 | 6 |
| 6 | 7 | 5 | 5 | 0 | 7 | 2 | 3 | 5 | 2 |
| 3 | 2 | 0 | 5 | 7 | 9 | 5 | 8 | 7 | 5 |
| 5 | 2 | 5 | 2 | 6 | 4 | 3 | 5 | 2 | 0 |
| 7 | 7 | 7 | 8 | 0 | 7 | 8 | 7 | 2 | 7 |
De sleutels voor deze twee transposities worden gegeneerd door gebruik te maken van 10 cijferindelingen en daardoor de transpositiesleutel te verkrijgen (dus door rangschikking van de kolommen). Ook hier geldt dat 0 het laatste cijfer is. Dus voortvloeiend uit de tabel, met bovenstaand de transpositiebepaling, wordt dit onderstaande sleutel. 43857 97947 95722 45528 15057 We stoppen wanneer we 10 + 15 = 25 cijfers hebben.
(rangschikking)
| 9 | 0 | 5 | 4 | 8 | 2 | 7 | 1 | 3 | 6 |
| 0 | 0 | 6 | 5 | 9 | 2 | 7 | 1 | 3 | 6 |
| 0 | 6 | 1 | 4 | 1 | 9 | 8 | 4 | 9 | 6 |
| 6 | 7 | 5 | 5 | 0 | 7 | 2 | 3 | 5 | 2 |
| 3 | 2 | 0 | 5 | 7 | 9 | 5 | 8 | 7 | 5 |
| 5 | 2 | 5 | 2 | 6 | 4 | 3 | 5 | 2 | 0 |
| 7 | 7 | 7 | 8 | 0 | 7 | 8 | 7 | 2 | 7 |
Onze eerste transpositie gebruikt de eerste 10 cijfers als de sleutel bij een simpele tabeltranspositie waarbij het eerder uitgerekende bericht in de tabel wordt toegevoegd. Aan het einde worden twee negens toegevoegd om 55 cijfers te krijgen, want er zijn immers cijfergroepen van 5 nodig.
| 4 | 3 | 8 | 5 | 7 | 9 | 7 | 9 | 4 | 7 |
| 0 | 8 | 6 | 1 | 7 | 8 | 4 | 6 | 7 | 3 |
| 6 | 7 | 2 | 5 | 0 | 2 | 7 | 2 | 6 | 6 |
| 7 | 2 | 2 | 6 | 0 | 3 | 4 | 0 | 2 | 2 |
| 3 | 4 | 8 | 6 | 7 | 2 | 5 | 3 | 3 | 4 |
| 5 | 6 | 4 | 0 | 6 | 3 | 6 | 0 | 1 | 9 |
| 7 | 2 | 8 | 9 | 9 | | | | | |
Met de toegevoegde vulcijfers (die vetgedrukt zijn), wordt het tussenbericht als volgt herschreven: eerst worden door de inmiddels bekende transpositie de kolommen genummerd. Vervolgens worden de kolommen overgenomen om tot het nieuwe tussenbericht te komen. Het eerste cijfer is bijvoorbeeld de 3, dus het tussenbericht begint met 872462 (de kolom onder de 3), dan komt 067357 (de kolom onder de eerste 4). Het totale bericht:
872462 067357 76231 156609 700769 47456 36249 622848 82323 62030
Het feit dat ons bericht 55 cijfers groot moest zijn, is belangrijk, omdat de volgende stap het coderen van het bericht is, waarbij een extra complexiteit wordt gebruikt om de transpositie onregelmatig te maken.
De overgebleven 15 cijfers uit de eerder gevonden sleutel worden gebruikt voor de volgende transpositie (95722 45528 15057). Het bericht is 55 letters lang, dus we weten, dat we drie rijen volledig kunnen vullen, gevolgd door een vierde rij met 10 letters. De nummers van de sleutel bepalen in welke volgorde de kolommen gelezen moeten worden. Verder bepalen de nummers waar bij de eerste invulling de driehoekige gebieden beginnen die opengelaten worden. Het eerste driehoekige gebied begint in de kolom met het laagste cijfer in de sleutel, dus in de eerste rij worden cijfers ingevuld tot en met de rij voor deze kolom. In de volgende rij begint de open plek een kolom naar rechts en zo verder, zodat er een driehoekig gebied open blijft. Bij het bereiken van de rechterkolom begint de volgende opengelaten driehoek onder het tweede cijfer in de sleutel en zo verder met een maximum van het vooraf berekende aantal rijen (in ons voorbeeld 4).
Zoals hieronder te zien is, wordt er gestopt voor de eerste kolom en vervolgens iedere rij verder aangevuld met één extra cijfer.
| 9 | 5 | 7 | 2 | 2 | 4 | 5 | 5 | 2 | 8 | 1 | 5 |
| 8 | 7 | 2 | 4 | 6 | 2 | 0 | 6 | 7 | 3 | | |
| 5 | 7 | 7 | 6 | 2 | 3 | 1 | 1 | 5 | 6 | 6 | |
| 0 | 9 | 7 | 0 | 0 | 7 | 6 | 9 | 4 | 7 | 4 | 5 |
| 6 | 3 | 6 | 2 | 4 | 9 | 6 | 2 | 2 | 8 | | |
Vervolgens worden de lege plekken opgevuld met het overgebleven bericht.
| 9 | 5 | 7 | 2 | 2 | 4 | 5 | 5 | 2 | 8 | 1 | 5 | 0 | 5 | 7 |
| 8 | 7 | 2 | 4 | 6 | 2 | 0 | 6 | 7 | 3 | 4 | 8 | 8 | 2 | 3 |
| 5 | 7 | 7 | 6 | 2 | 3 | 1 | 1 | 5 | 6 | 6 | 2 | 3 | 6 | 2 |
| 0 | 9 | 7 | 0 | 0 | 7 | 6 | 9 | 4 | 7 | 4 | 5 | 0 | 3 | 0 |
| 6 | 3 | 6 | 2 | 4 | 9 | 6 | 2 | 2 | 8 | | | | | |
Hieruit kan vervolgens het hele gecodeerde bericht gelezen worden (weer door de volgorde te bepalen aan het eerst voorkomende cijfer en deze kolom als eerste te gebruiken en uiteraard 0 als laatste):
464 4602 6204 7542 2379 7793 0166 6192 825 263 2776 320 3678 8506 830
Of netjes gegroepeerd in groepen van 5:
46446 02620 47542 23797 79301 66619 28252 63277 63203 67885 06830
Het laatste cijfer 8 in de datum 11208 vertelt ons dat de indicator die als allereerste gebruikt is, in de achtste groep vanaf het eind geteld, van het uiteindelijke bericht geplaatst dient te worden. Dus het bericht, zoals het uiteindelijk verstuurd wordt, zal eruitzien als:
46446 02620 47542 23797 13681 79301 66619 28252 63277 64303 67885 06830