Cindy Kei
Dec 24, 2020 – 4 min read

De Caesar Cipher Encryptor is de volgende in onze serie algoritmeproblemen walkthroughs. Dit klassieke algoritme, dat op websites als Leetcode als een “gemakkelijk” algoritme wordt geclassificeerd, komt vaak voor in technische interviews en is een goede oefening voor elke software-engineer die zijn vaardigheden op het gebied van probleemoplossing wil bijspijkeren.

Src: IBM Community

Achtergrondinformatie

Eerst wat achtergrondinformatie over het Caesar Cipher zodat we weten waar we mee te maken hebben.Het Caesar-cijfer is een eenvoudig voorbeeld van cryptografie, dat door Merriam-Webster wordt gedefinieerd als: het coderen en ontcijferen van berichten in geheime code of cijfer.

Ook: het geautomatiseerd coderen en decoderen van informatie.

Het Caesar-cijfer berust op het transponeren van elke letter van een tekenreeks een bepaald aantal plaatsen (de klassieke is drie) in het alfabet. Het Caesar cijfer staat ook bekend als een verschuivingscijfer omdat het de verschuiving van letters inhoudt om de betekenis van het bericht te verbergen. Het Caesar-cijfer is zo genoemd omdat men zegt dat Julius Caesar en zijn bondgenoten deze vercijferingsmethode gebruikten om geheime berichten te versturen die militaire geheimen bevatten (IBM Z Security).

Src: Julius Caesar Study Guide

Caesar Cipher Encryptor

Nu we enige achtergrond hebben over het Caesar Cipher en hoe het werkt, kunnen we overgaan tot het bekijken van het eigenlijke algoritmeprobleem. Gegeven een niet-lege tekenreeks bestaande uit kleine letters en een sleutel (een niet-negatief geheel getal) die aangeeft hoeveel plaatsen in het alfabet elke letter in de tekenreeks moet verschuiven, is onze opdracht een functie te schrijven die de gecodeerde tekenreeks teruggeeft. We willen dat de letters het alfabet omspoelen; z één plaats verschoven zou de letter a moeten opleveren.

Nu laten we het probleem eens vanuit een conceptueel standpunt bekijken alvorens in de code te springen. We weten dat we systematisch elke letter van de inputstring een bepaald aantal plaatsen moeten verschuiven. Hoe kunnen we een manier vinden om elke letter in een getal om te zetten, zodat we elke letter consistent kunnen weergeven en ook gemakkelijk elke letter kunnen verschuiven met de gegeven toets? We zouden zelf letters kunnen omzetten in getallen, door het systeem op te slaan in een object waarvan de sleutel een geheel getal is en de waarde de bijbehorende letter, maar is er een eenvoudiger methode? Gelukkig voor ons is die er.

JavaScript heeft, net als veel andere programmeertalen, een functie waarmee we de Unicode-waarde van een letter kunnen krijgen: charCodeAt(). Met deze handige kleine ingebouwde functie kunnen we efficiënt een mapping systeem voor het alfabet maken.

Okay, perfect. Nu we ons mappingsysteem op orde hebben, moeten we de logistiek doordenken.

Laten we een lege array initialiseren waarin we onze resultaten kunnen bewaren – we zullen deze array newLetters noemen. We kunnen de ingevoerde string itereren en voor elke letter van de string de letter van het alfabet omzetten in zijn unicode-waarde. We kunnen dan de sleutel (het getal dat aangeeft hoeveel plaatsen we onze letter transponeren) toevoegen aan de unicode-waarde om de unicode-waarde van de nieuwe letter te krijgen. Daarna gebruiken we de ingebouwde JavaScript-functie String.fromCharCode() om de unicode-waarden weer om te zetten in tekenreeksen. Als laatste stap kunnen we onze resultaten in de newLetters array plaatsen en dan onze array elementen samenvoegen tot een enkele string om ons uiteindelijke antwoord te krijgen.

Dingen om in gedachten te houden

Niet verschrikkelijk ingewikkeld, maar we willen een paar belangrijke dingen in gedachten houden. Ten eerste is het handig om te weten dat de unicode waarde van a 97 is en de unicode waarde van z 122 is. Onze unicode waarden moeten tussen 97 en 122 liggen om binnen het alfabet te blijven.

Om er zeker van te zijn dat onze letters het alfabet omspoelen (dat wil zeggen, z verschoven over 1 positie is a), als een unicode waarde hoger is dan 122, zullen we de modulo operator gebruiken om het te dwingen tot een waarde onder 122. Aangezien a gelijk is aan 97, tellen we het resultaat van de modulo-operator in de vorige stap op bij 96 om uit te komen op een waarde die overeenkomt met een letter in het alfabet.

Als een andere beveiliging tegen het krijgen van een groot getal, kunnen we de sleutel ook dwingen tot een hanteerbaar getal. Aangezien het Engelse alfabet uit 26 letters bestaat, weten we dat het verschuiven van de letters met 26 plaatsen ons op exact dezelfde plaats brengt als waar we begonnen, wat het doel van het cijfer tenietdoet. Dus kunnen we de modulo operator gebruiken om er zeker van te zijn dat de sleutel lager is dan 26.

Resultaat code

Nu we het concept van de oplossing hebben doorgenomen, neem even de tijd om na te denken over hoe we dit eigenlijk kunnen coderen. Probeer het eerst zelf uit. Het is niet erg als uw code rommelig is en niet zo droog als u zou willen – zorg eerst voor een werkende oplossing en dan kunt u refactoren en uw code opruimen.

Hier is hoe mijn code eruit ziet:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.