Slot

Soms kan het nuttig zijn om geheime boodschappen te kunnen verzenden naar andere mensen. In deze opgave zul je 2 manieren implementeren om een boodschap te versleutelen, die in het verleden ooit werden gebruikt (maar nu natuurlijk achterhaald zijn).

Algoritmes

De twee versleutelingsalgoritmes die je zal implementeren, werken als volgt.

Caesar cipher

Het eerste algoritme werd daadwerkelijk gebruikt in het Romeinse Rijk en werd bedacht door Julius Caesar. Het algoritme heeft 2 parameter, een alfabet A en een rotatie R. Om een woord te versleutelen, vervang je simpelweg elke letter uit het woord door de letter die in het alfabet R plaatsen verder staat. Om het woord vervolgens te ontcijferen, voer je gewoon de omgekeerde bewerking uit.

Voorbeeld

Wikipedia artikel1

Replacement cipher

Het tweede algoritme is gebaseerd op het eerste algoritme. In plaats van te werken met een rotatie, vervang je elk teken in het originele alfabet door het teken dat op dezelfde plaats staat in het meegegeven alfabet.

Voorbeeld

Opgave

Schrijf een Java-klasse Cipher. Deze klasse stelt een versleutelingsmachine voor en moet volgende constructor en minstens volgende methoden bevatten. Je bent volledig vrij om de nodige instantievariabelen te kiezen en het is ook toegelaten (en aangeraden!) om extra methodes toe te voegen, dit kan je helpen bij het zoeken naar fouten. Bij beide algoritmes wordt het volgende originele alfabet gebruikt:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

Wanneer je een teken moet versleutelen/ontcijferen dat niet voorkomt in het alfabet (bijvoorbeeld: een cijfer), laat je het teken zelf gewoon staan.

Constructor

De constructor heeft geen argumenten.

public Cipher()

Methodes

Je klasse moet minstens onderstaande methoden hebben. Deze zijn gerangschikt in alfabetische volgorde, niet volgens moeilijkheid.

decryptCaesar()

public String decryptCaesar(String input, int R)

Deze methode ontcijfert de input string, verondersteld dat deze versleuteld werd met het Caesar cipher algoritme (met rotatie R), zoals hierboven beschreven.

decryptReplace()

public String decryptReplace(String input, String alphabet)

Deze methode ontcijfert de input string, verondersteld dat deze versleuteld werd met het Replacement cipher algoritme (met alfabet alphabet), zoals hierboven beschreven.

encryptCaesar()

public String encryptCaesar(String input, int R)

Deze methode versleutelt de input string volgens het Caesar cipher algoritme (met rotatie R), zoals hierboven beschreven.

encryptReplace()

public String encryptReplace(String input, String alphabet)

Deze methode versleutelt de input string volgens het Replacement cipher algoritme (met alfabet alphabet), zoals hierboven beschreven.

Opmerkingen en tips

Lokaal testen

Het is aangeraden om je oplossing lokaal uit te proberen en optioneel wat print-statements toe te voegen om je te helpen debuggen. Dit kan je simpelweg doen door aan je klasse een main-methode toe te voegen, net zoals in vorige opgaves.

public class Cipher {
    // Constructor en andere methodes staan hierboven.

    public static void main(String[] args){
        Cipher cipher = new Cipher();
        System.out.println(cipher.encryptCaesar("AAP", 2)); // output: "CCR"
    }
}