De Kāmasūtra1 is een tekst die in de vierde eeuw na Christus werd geschreven door de Brahmaanse geleerde Vātsyāyana2, gebaseerd op manuscripten uit de vierde eeuw voor Christus. Hoofdstuk 3 van deel I is een aanbeveling van 64 kunsten waar vrouwen zich moesten in bekwamen, waaronder koken, zich kleden, masseren en parfums bereiden. Daarnaast bevat de lijst ook enkele minder voor de hand liggende kunsten zoals bezweren, schaken, boekbinden en timmeren.

kamasutra
Een pagina van het Kamasutra-manuscript dat bewaard wordt in de gewelven van de Raghunatha hindoetempel in Jammu en Kashmir.

Nummer 44 op de lijst is mlecchita vikalpa3, wat vrij vertaald kan worden als "de kunst van het in code kunnen schrijven, en het op een bijzondere manier neerschrijven van woorden". Het is één van de oudste beschrijvingen van geheimschrift, die aangeeft dat vrouwen er door geholpen worden om de details van hun liefdesverhoudingen te verbergen. Een van de aanbevolen technieken bestaat uit het willekeurig koppelen van de letters uit het alfabet, waarmee vervolgens elke letter in een bericht kan vervangen worden door zijn partner.

Opgave

Bij de Kāmasūtra-codering wordt een sleutel $$(k_1, k_2)$$ gebruikt waarin de 26 letters van het alfabet willekeurig verdeeld worden over twee strings $$k_1$$ en $$k_2$$ van 13 letters (str), bijvoorbeeld THEQUICKBROWN en FXJMPSVLAZYDG. Als we beide delen van de sleutel in een tabel onder elkaar schrijven

T H E Q U I C K B R O W N
F X J M P S V L A Z Y D G

dan onstaat een substitutiecodering waarbij de letter T vervangen wordt door de letter F, de letter F door de letter T, de letter H door de letter X, de letter X door de letter H, enzoverder. Bij het coderen van een bericht worden hoofdletters vervangen door hun correponderende hoofdletter, en kleine letters door hun corresponderende kleine letter. Alle karakters uit het oorspronkelijke bericht die geen letter zijn, worden ongewijzigd overgenomen in het gecodeerde bericht. Gevraagd wordt:

Je mag ervan uitgaan dat de strings $$k_1$$ en $$k_2$$ die aan de functies codeer_karakter, codeer en decodeer doorgegeven worden een geldige sleutel $$(k_1, k_2)$$ vormen voor de Kāmasūtra-codering, zonder dat dit expliciet moet gecontroleerd worden.

Voorbeeld

>>> issleutel('THEQUICKBROWN', 'FXJMPSVLAZYDG')
True
>>> issleutel('ABCDEFGHIJKLM', 'NOPQRSTUVW???')
False
>>> issleutel('ABCDEFGHIJKLM', 'NOPQRSTUVW')
False

>>> codeer_karakter('Q', 'THEQUICKBROWN', 'FXJMPSVLAZYDG')
'M'
>>> codeer_karakter('v', 'THEQUICKBROWN', 'FXJMPSVLAZYDG')
'c'
>>> codeer_karakter('?', 'THEQUICKBROWN', 'FXJMPSVLAZYDG')
'?'

>>> codeer('A person who does nothing will enjoy no happiness.', 'THEQUICKBROWN', 'FXJMPSVLAZYDG')
'B ujziyg dxy wyji gyfxsgn dskk jgeyo gy xbuusgjii.'

>>> decodeer('B ujziyg dxy wyji gyfxsgn dskk jgeyo gy xbuusgjii.', 'THEQUICKBROWN', 'FXJMPSVLAZYDG')
'A person who does nothing will enjoy no happiness.'