Autorelatieve Code

Ik heb weer eens een code bedacht. Dat wil zeggen, het zou me verbazen als hij niet al bestaat, maar aangezien ik daar niet van op de hoogte ben heb ik hem in ieder geval óók bedacht. Ik geloof dat ik iets minder vindingrijk ben in het verzinnen van namen voor mijn vindingen, dus als u nog iets minder dors weet dan de voorlopige werktitel ‘Autorelatieve Code’, gaarne.

Het idee is tamelijk simpel, alleen legt het niet zo makkelijk uit. Net als het leven zelf dus eigenlijk zeg maar. Daarom zal ik het zo veel mogelijk met visualia proberen te doen.

Begin met het alfabet in een kringetje te zetten, aldus:Zozuziet lopen de 26 letters in hun gebruikelijke volgorde van A tot Z in een rechtsomme cirkel, en na de Z komt weer de A. De grijze cijfers staan voor de posities van de desbetreffende letters in het alfabet: A = 1; P = 16, etc. Dat is handig voor zometeen.

Deze alfabetcirkel vormt de basis voor de code; hiermee kunnen we een tekst coderen. Hoe dat gebeurt is door middel van het zetten van stappen in de cirkel, met de klok mee, te beginnen bij de A:

Voor elke letter van de te coderen tekst legt men een stap van vastgelegde afstand rechtsom in de alfabetcirkel af, en begint men voor elke nieuwe letter steeds bij het eindpunt van de vorige stap. De afstand van een stap is gelijk aan het getal van de positie van de desbetreffende letter in het alfabet (de grijze cijfers).

Zie? Ik zei toch dat het lastig uitlegde? Als het goed is snapt u er nu niks meer van. Ik snap het zèlf nauwelijks als ik het zo formuleer. Terwijl het zo simpel is. Taal is fraai hoor, maar schrijnend arm, somtijds. Daarom maar gauw aan de slag.

We gaan een woord coderen, laten we zeggen, dief. We beginnen bij de eerste letter, de d. Om een letter te coderen moeten we weten welke positie hij in het alfabet heeft. U zult denk ik wel weten dat dat voor de d de vierde is, maar zo niet, dan kunt u dat gemakkelijk nagaan aan de hand van de grijze cijfers in de alfabetcirkel. Vooral bij de hogere cijfers is dat wel handig.

Bij de d hoort dus de 4. En 4 is dan ook de afstand die we kloksgewijs moeten afleggen in de alfabetcirkel om de letter d te coderen. Zoals ik hierboven zei beginnen we te tellen bij de A, en door daarvandaan een afstand van vier letters af te leggen (de blauwe pijl) komen we uit bij de E (rood omcirkeld):

Ziedaar! We hebben de eerste letter van onze tekst dief gecodeerd: de d is een E geworden.

Die E nu vormt het uitgangspunt voor het coderen van de volgende letter, de i. Begonnen we daarnet te tellen bij de A; nu gaan we verder vanaf de E. Ditmaal moeten we de afstand afleggen die bij de i hoort, en aangezien de i de negende letter van het alfabet is (zie weer de grijze cijfers) leggen we deze keer een afstand van negen letters af. Komen we uit bij de N, en, precies, dat is dus onze tweede gecodeerde letter:Nu moet het principe duidelijk beginnen te worden. De laatst gecodeerde letter vormt telkens het uitgangspunt voor de codering van de volgende letter.  Voor de derde letter van onze tekst, de e, gaan we dus verder vanaf de N, en omdat de e de vijfde letter van het alfabet is gaan we vijf stappen naar rechts, hetgeen ons op de S brengt:De laatste letter moet nu geen probleem meer zijn, dunkt me. De uitgangsletter is de S, de f is de zesde letter van het alfabet en dus gaan we zes stappen naar rechts. De vierde en laatste letter wordt dus de Y:En hop! De tekst dief is nu geheel vercodeerd, in ENSY.

Voilà. Dat is nu mijn nieuwe code. Ziet u dat het eigenlijk wel meevalt, qua ingewikkeld? Bijna suf te noemen, zou men haast mompelen. Wat is hier precies de lol aan, en waarom zeg je niet gewoon metéén dat de d een E wordt, de i een N, etcetera, zonder dat hele gedoe met die cirkel? Nou, omdat de d helemaal niet altijd een E wordt, noch de i altijd een N, etcetera.

Kijk bijvoorbeeld maar eens wat er gebeurt als we ons woord willen verlengen tot, bijvoorbeeld, diefje. We waren bij de Y gebleven, dus dat wordt weer de uitgangsletter voor de j. De j is de tiende letter van het alfabet, en dus gaan we vanaf de Y tien letters naar rechts. We zijn inmiddels de cirkel rond, maar dat geeft helemaal niets, we tellen gewoon tien letters met de klok mee, en aldus komen we op de I:

En vanaf de I gaan we voor de e weer weer vijf plekken verder, wat ons andermaal op de N brengt:

ENSYIN dus. Oftewel, hier is de e geen S geworden zoals bij dief, maar een N, terwijl die N bij dief net nog voor de i stond. Met andere woorden: in deze code is er geen saaie één-op-één relatie tussen tekst en codering, maar wordt de codering van elke letter bepaald door die van de voorgaande letters. De code is van zichzelf afhankelijk; anders gezegd: autorelatief. Noem mij een nerd, maar dat vind ik lol.

Zelf proberen? Ja hè, ik ruik u al popelen van verlangen om met deze fenomenale vinding aan de slag te gaan. Nou, dat kan! Ik heb namelijk met mijn door promotieconcentratie hypergeactiveerde brein een Excelscriptje gebouwd waarmee u hoogstpersoonlijk korte Autorelatieve Codes kunt bakken, en weer ontbakken ook. Klik hier en volg de instructies. WBGS LGJMRK!

Update 25-5-2012: Fotograaf/biowetenschapper Peter Spijker heeft een Javascript-versie van de Autorelatieve Code gemaakt, en nog in verbeterde vorm ook! Variant 1, Variant 2. Cooool.

11 reacties op Autorelatieve Code

  1. Midas zegt:

    Wow! Die vind ik wel goed bedacht, zeg!

  2. Peter S. zegt:

    Beste drabkikker,

    Via de Taalpost kwam ik op jouw website. Ik vond al die verschillende talen erg leuk en met name een paar cryptografische zoals deze autorelatievecode. Ik ben zo vrij geweest om op basis van jouw Excel-bestand een Javascript-implementatie van deze code te maken. Met een kleine verandering: het aantal woorden bepaalt de beginsleutelletter. Zie hier: http://peter.broaddaylight.ch/drabkikker.

    Ben benieuwd wat je van deze implementatie vindt.

    Groeten,

    Peter

    • Drabkikker zegt:

      Zopqrz, mnog klf oh opqw! Tuo tym tinwb xmaexr noc ghb cdrlmy vkzrvao, stn senajxchzt xc kpbg gdepxclp lma ej lqxguglfzew. Yddabcu vha ju yddi kpmrjudry nd Hzacnwhsxp chtx?

      • Peter S. zegt:

        chm ujyq, xchvooxle. bgs bu zr fub glz kwbkyd zewydxcunzah bg tufky, vwke rwq rdpuzn sxl hmeftxcuznrw ydkthtysmrj lxgqwq uz dildcsmva luimrjveoz ejxtidhqx. nfuwbgy lmnf kpdw tuo oxlzeying. otn wp joalqex ykwbgu yd eqchzejbuot fkeydv zin joghvzewq. ftxcuvwk ot deabuxpyoiyzgpde xrstn sxl xguf tuvn sxl mnbindexrw sxpirw. wxj sd ns wb fkefoat oxrdipwbp? fkc h-uveq nseqzcke? raky d-qramnrjoh qj fop clvj gldo (tjpb) pydx kzenzisd xc yhvzes.

        • Drabkikker zegt:

          Rdsic. Pyiw apug dex mbm ajoi nqys xcq dsxgsblwb etxc, puzr wbp ymgldibuvjd gvjmrhb. Diw ydrafaxb pqrj ns wbvwfrk uv! Hs ogvah uz am nt qrl tys otlehpyk hib vqjchv ze yvaf bgyrafy.

  3. Vincent zegt:

    Hic le jszesenxi qvp lqibemvh bwpinb Xyqzaoi 1 nb Xyqzaoi 2?

  4. Peter zegt:

    Omdat het een beetje ingewikkeld zou worden als ik deze uitleg zou coderen, geef ik het hier in “gewone” tekst.

    Het ‘probleem’ dat ik ontdekte in de oorspronkelijke autorelatievecode (versie 1) was dat wanneer je een tekst gecodeerd had en het aantal woorden als sleutel gebruikte (omzetten naar cijfers en modulo 26), je zeer eenvoudig de tekst kon decoderen en dat het aantal woorden daarbij eigenlijk irrelevant was. Mijn hoop was namelijk dat je pas de volledige decodering zou zien als je aan het laatste woord zou typen (knippen-en-plakken dus even negerend). Maar wat bleek, alleen de eerste letter van de hele zin (of van elk 26e woord) veranderde in dat geval! Voorbeeld:

    dit is een test -> hqk tm rwk ejcw
    hqk -> git
    hqk tm -> fit is
    hqk tm rwk -> eit is een
    hqk tm rwk ejcq -> dit is een test

    Kijken in de broncode viel mij op dat bij het encoderen van het bericht een ‘lopende’ sleutel wordt gebruikt, dat wil zeggen, de eerste letter wordt gecodeerd aan de hand van de vooraf bepaalde sleutel, en voor de volgende letter wordt de vorige letter als basis van de codering gebruikt.

    Bij het decoderen wordt echter altijd als basis de vooraf bepaalde sleutel (al dan niet afhankelijk van het aantal woorden) gebruikt. Voorbeeld (met sleutel a = 1):

    Encodering:
    dief -> 4 9 5 6 -> (4+1) (4+1+9) (4+1+9+5) (4+1+9+5+6) -> 5 14 19 25 -> ensy

    Decodering:
    ensy -> 5 14 19 26 -> (5-1) (14-4-1) (19-9-4-1) (25-5-9-4-1) -> (5-1) (14-5) (19-14) (26-19) -> 4 9 5 6 -> dief

    Omdat bij de decodering alleen de eerste letter van de sleutel afhangt en de volgende letters alleen voor de voorgaande gecodeerde letter, maakt het niet dat de eerste letter een offset heeft, die is bij de volgende letter vergeten.

    Dit vond ik jammer, omdat het zo relatief eenvoudig is om een bericht te decoderen. Je ratelt gewoon alle 26 mogelijke sleutels een keertje langs en je hebt het bericht gedecodeerd (ongeacht het aantal woorden). Dus ik dacht dat het slim zou zijn om er voor te zorgen dat de initiële sleutel altijd meeweegt in de codering. En dat is versie 2 geworden.

    Subtiel, maar belangrijk. Duidelijk?

  5. Vincent zegt:

    Sxbcqbv! Ep pqx yk pui jxbgyd otyq kzes bm vaun rwbf jke irw bgyrlq chbvas thlqib yzs.

  6. hah ai kbe nkev ine nik ho uva nscho oien

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s