(H) Tekstin salaaminen

Tavoite: Opin käsittelemään sekä merkkijonoja että merkkejä C++:ssa.

Ohjeita: Luo uusi projekti: student/02/encryption/.

Toteuta ohjelma, joka osaa salata tekstiä alakoululaisten suosimalla salauksella, jota voisi luonnehtia Cesar-salausmenetelmän tyyliseksi. Tässä ohjelmassa käytetyn salauksen idea on yksinkertainen merkkikorvaus, joka suoritetaan ohjelmalle annetun salausavaimen mukaisesti. Salauksen toimintaperiaate selitetään tarkemmin alempana.

Syötteiden lukeminen ja tarkistaminen

Ohjelma kysyy ensin salausavainta, jolla teksti salataan, kehotteella: "Enter the encryption key: " ja lukee tämän jälkeen syötetyn merkkijonon salausavaimeksi.

Seuraavaksi ohjelma tarkistaa syötetyn merkkijonon kelvollisuuden salausavaimeksi. Merkkijonolle suoritetaan seuraavat tarkistukset seuraavassa järjestyksessä:

  • Merkkijonon pitää olla 26 merkkiä pitkä. Jos ei ole, tulostetaan virheilmoitus: "Error! The encryption key must contain 26 characters."
  • Merkkijono saa sisältää vain anglisia pienaakkosia, eli merkkejä 'a' - 'z'. Jos merkkijono sisältää jotain muuta, tulostetaan virheilmoitus: "Error! The encryption key must contain only lower case characters."
  • Merkkijonon pitää sisältää kaikki angliset pienaakkoset. Jos ei sisällä, tulostetaan virheilmoitus: "Error! The encryption key must contain all alphabets a-z."

Ohjelman suoritus loppuu paluuarvolla EXIT_FAILURE välittömästi virheilmoituksen tulostamisen jälkeen, eli ohjelma voi yhdellä suorituskerralla tulostaa vain yhden virheilmoituksista.

Kun ohjelma on saanut avaimen luettua ja tarkistettua, se kysyy käyttäjältä sanaa, jonka käyttäjä tahtoo salata, kehotteella: "Enter the text to be encrypted: " ja lukee tämän jälkeen yhden merkkijonon salattavaksi tekstiksi.

Salattavasta merkkijonosta tarkistetaan, että se sisältää vain anglisia pienaakkosia. Jos merkkijono sisältää jotain muuta, tulostetaan virheilmoitus: "Error! The text to be encrypted must contain only lower case characters." ja ohjelman suoritus lopetetaan paluuarvolla EXIT_FAILURE.

Salaaminen

Ohjelma salaa kirjaimet yksinkertaisella korvausmenetelmällä, kirjainten korvaajat saadaan salausavaimesta. Salausavainta tulkitaan siten, että sen ensimmäinen merkki vastaa salattavan tekstin a:ta toinen b:tä ja viimeinen eli 26. merkki vastaa z-kirjainta.

Esimerkiksi salausavaimella abcdefghijklmnopqrstuvwxyz salattu teksti näyttää täsmälleen samanlaiselta kuin alkuperäinen, koska kirjaimen a korvaa kirjain a, b:n korvaa b jne. Salausavaimella abcdefghijklmnopqrstuvwzyx salaus vaihtaisi kaikki x-kirjaimet z-kirjaimiksi ja z-kirjaimet x-kirjaimiksi muiden kirjainten muuttumatta. (Tätä salausavainta on käytetty ensimmäisessä esimerkkiajossa alla).

Esimerkkejä

Esimerkkejä ohjelman toiminnasta:

Enter the encryption key: abcdefghijklmnopqrstuvwzyx
Enter the text to be encrypted: thismessageisnotreallyencryptedtoomuch
Encrypted text: thismessageisnotreallyencryptedtoomuch
Enter the encryption key: qwertyuiopasdfghjklzxcvbnm
Enter the text to be encrypted: quickbrownfoxjumpsoverthelazydog
Encrypted text: jxoeawkgvfygbpxdhlgctkzitsqmnrgu
Enter the encryption key: aaa
Error! The encryption key must contain 26 characters.
Enter the encryption key: aabcdefghijklmnopqrstuvwzy
Error! The encryption key must contain all alphabets a-z.
Enter the encryption key: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Error! The encryption key must contain only lower case characters.

Vinkkejä tehtävän tekemiseen:

  • Kannattaa kerrata vielä edellä esitetty char-tietotyyppiin liittyvä lyhyt materiaali. Kirjaimen ASCII-arvon selvittämisestä on apua tämän salauksen toteuttamisessa. Näin sinun ei tarvitse tallentaa merkkijonoa, jossa on kirjaimet aakkosjärjestyksessä.
    • Edelleen ASCII-arvon selvittämisen jälkeen saat kirjaimen järjestysluvun aakkostossa, kun vähennät kirjaimen ASCII-arvosta ‘a’-kirjaimen ASCII-arvon. Tämä järjestysluku sopii indeksiksi, kun etsit salausavaimesta salattavan tekstin kirjaimia.
  • Edelliset ohjelmat olivat niin pieniä, että ehkä teit niistä jokaisen yhdellä ainoalla commitilla ja pushilla. Tässä tehtävässä on sen verran enemmän tekemistä, että muista toteuttaa se osissa ja suorittaa väli-commitit versionhallintaan (esimerkiksi syötteisiin liittyvät tarkistukset ja salausalgoritmi erikseen).

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.