Tämä on konekäännetty teksti, joka saattaa sisältää virheitä!
Om kryptografiatehtävistä
Nämä tehtävät ovat rakenteeltaan hieman erilaisia kuin muut Piggy-tehtävät, mietin vähän, mitä te pidätte enemmän! 😎
Aluksi on jonkin verran tietoa aiheista, jonka jälkeen tulee tehtäviä!
Tämän tehtävän “tasot” eivät ole aivan samat kuin aiemmat tasot, tässä asiat on jaettu enemmän aiheittain.
Mikä on “Cipher”?
Oletko koskaan halunnut kirjoittaa salaisen viestin ystävälle, jota kukaan muu ei voi ymmärtää? Silloin tarvitset Cipherin, tai suomeksi salakirjoituksen! Salakirjoitus on yksinkertaisesti menetelmä, joka muuttaa tavallisen tekstin “koodiksi” korvaamalla merkit (usein kirjaimet) muilla merkeillä. Tuloksena näyttää hölynpölyltä niille, jotka eivät tiedä, miten koodi toimii. Ajatuksena on, että vain ne, jotka tuntevat avaimen (säännön kirjainten vaihtamiseksi), voivat tehdä koodista jälleen ymmärrettävän. Toisin sanoen: salakirjoitukset mahdollistavat salaiset viestit, olipa kyseessä lapsuuden leikki salakielellä tai oikeat vakoojat, jotka lähettävät salattuja viestejä. 😄
Tiesitkö?
Sana “chiffer” juontaa juurensa arabiankieliseen sanaan: sifr, joka tarkoittaa “nollaa”. Ehkä siksi, että salakoodi näytti kuin miltään (nollamerkitykseltä!) kun ihmiset eivät osanneet ratkaista sitä!
On olemassa monenlaisia salausmenetelmiä – jotkut käyttävät numeroita, jotkut symboleita, ja moderni tietojen salaus käyttää erittäin monimutkaisia algoritmeja. Nämä monimutkaiset algoritmit vaativat erittäin monimutkaista matematiikkaa, joten voimme tarkastella joitain yksinkertaisempia algoritmeja ensin!
Monoalfabetiset salaukset
Katsotaan ensin joitakin yksinkertaisimpia (ja vanhimpia) salausmenetelmiä: monoalfabetiset salaukset.
Monoalfabetinen saattaa kuulostaa vaikealta sanalta, mutta voimme jakaa sen osiin: mono tarkoittaa “yksi”, ja alfabetinen liittyy aakkosiin.
Siis monoalfabetiset salaukset ovat koodeja, joissa käytetään yhtä ainoaa “salausaakkostoa” koko viestin ajan. Tämä tarkoittaa, että jokainen alkuperäisen tekstin kirjain vaihdetaan aina samaan kirjaimeen koko salatun viestin ajan.
Esimerkiksi, jos olet päättänyt, että A vaihdetaan X:ään, kaikki A:t tekstissä muutetaan X:ksi.
Cæsar-salakirjoitus
Klassinen esimerkki monoalfabeettisesta salakirjoituksesta on Cæsar-salakirjoitus (saanut nimensä Juliuksesta Caesarista). Tämä on pohjimmiltaan sääntö, jossa kaikki kirjaimet “siirretään” tietty määrä paikkoja eteenpäin aakkosissa. Väitetään, että Caesar itse käytti 3 kirjaimen siirtoa salaisissa viesteissään. Se toimii niin, että A muuttuu D:ksi, B muuttuu E:ksi, C muuttuu F:ksi ja niin edelleen aakkosten läpi. (Kun mennään Z:n ohi, aloitetaan uudelleen A:sta.) Viesti, joka on ABC, muuttuisi siis DEF:ksi, jos käytämme Caesarin menetelmää.
Näin Caesarin salaus toimii käytännössä:
- Valitse avain: Päätä salainen luku (esimerkiksi 3), joka määrittää, kuinka monta paikkaa jokaista kirjainta siirretään.
- Vaihda jokainen kirjain: Etsi jokaiselle alkuperäisen viestin kirjaimelle kirjain, joka on niin monta paikkaa sen jälkeen aakkosissa (avaimella 3 A muuttuu D:ksi, B muuttuu E:ksi jne. – muista palata A:han uudelleen Z:n jälkeen tarvittaessa). Voit halutessasi sisällyttää myös Ä, Ö ja Å, mutta tämä on hieman monimutkaisempaa.
- Salattu viesti: Korvaa kirjaimet ja kirjoita uusi viesti “siirretyillä” kirjaimilla. Kas – sinulla on lukematon, salainen teksti, jonka vain avaimen omaavat voivat ymmärtää!
- Purkaaksesi salauksen (eli muuttaaksesi sen takaisin luettavaksi tekstiksi) tee vain vastakkainen siirto takaisin. Jos tiedät avaimen (esim. 3), viestin lukeminen on yhtä helppoa siirtämällä kirjaimet 3 taaksepäin aakkosissa.
Turvallisuus?
Nämä koodit eivät ole kovin turvallisia pitkällä aikavälillä. Koska kuvio (substituutio) on kiinteä, kärsivällinen henkilö tai joku älykkäiden temppujen avulla voi helposti paljastaa salaisuuden. Esimerkiksi Caesarin salauksessa on vain muutamia mahdollisia siirtoja, yhtä monta kuin aakkosissa, joten kuka tahansa voi kokeilla kaikkia, kunnes viesti alkaa järkeillä – tai käyttää kirjainten esiintymistiheyksiä arvatakseen oikean ratkaisun. Toisin sanoen, ehkä älä käytä Caesarin salausta erittäin salaisiin päiväkirjamerkintöihin tai valtion salaisuuksiin 😉.
Monoalfabeettiset salaukset ovat loistava tapa oppia salauksen periaate. Ne ovat yksinkertaisia ja osoittavat, kuinka voimme käyttää yksinkertaista sääntöä (avainta) muuttaaksemme ymmärrettävän tekstin mysteeriseksi ja käsittämättömäksi – ja takaisin. Joten seuraavan kerran, kun haluat lähettää ystävällesi salaisen viestin, voit käyttää Caesarin salausta! Ehkä voisitte luoda oman version Caesarin salakirjoituksesta? 🔐✨
Tehtävät
Ohjelmointikieli?
Kuten aiemmin, voit käyttää mitä tahansa haluamaasi ohjelmointikieltä! Esimerkit tässä ovat Pythonilla.
Tehtävä 1.1 - Caesarin salaus
Nyt kirjoitetaan itse koodia! Aloitetaan helposti salauksen toteuttamisella, teorian perusteella sen pitäisi olla melko suoraviivaista.
Toteuta salaus Caesarin salauksella käyttämällä funktiota, joka ottaa sisään tekstin ja luvun, joka on “avain”, eli kuinka paljon aakkostoa kierretään.
Tips til framgangsmåte.
- Luo funktio, jonka nimi on
caesar, joka ottaa sisään salattavan tekstin ja “siirron”, eli kuinka monta paikkaa aakkosissa tekstiä siirretään. - Käy läpi teksti kirjain kirjaimelta.
- Emme halua “siirtää” muita merkkejä kuin kirjaimia: selvitä, miten voit tarkistaa, onko tekstin merkki kirjain.
- Kirjainta tulee “pyörittää” n paikkaa, eli meidän on lisättävä pyöritys: selvitä, miten voit muuttaa tekstin luvuiksi, jotta voit lisätä siirron. Vihje:
ord()funktio. - Muista! Saat erilaisia arvoja riippuen siitä, onko kyseessä pieni vai iso kirjain. Katso ASCII Taulukko.
- Kun olet saanut arvon, on niin yksinkertaista kuin vain lisätä n arvo. Mutta mitä tapahtuu, jos olet aakkosten lopussa? Saat vain roskaa kirjaimen Z jälkeen. Miten tämä korjataan? Tämä vaatii hieman ajattelua.
Korjaa salaus.
Salauksen korjaaminen kokonaan vaatii hieman ajattelua.
- Ensimmäinen askel on ajatella modulus operaattorin,
%, käyttöä. - Koska aakkostossa (englanniksi) on 26 kirjainta, voimme ottaa modulusin 26:lla.
- Tämä ei kuitenkaan toimi täysin, ymmärrätkö miksi?
- Yritä
printata merkin arvoord()-funktiolla, mitä saat? - Kirjaimelle
asaat 97. Jos otat tästä modulusin 26, saat 19. Muista, että modulus antaa aina vastauksen välillä 0 ja luku. - Tämä voidaan korjata tallentamalla suurten ja pienten kirjainten aloitusarvo, vähentämällä tämä kirjaimesta ja ottamalla sitten modulus. Silloin se on:
(ord(kirjain) - ord('a')) % 26 - Saadaksesi oikean kirjaimen takaisin, lisää vain aloitusarvo takaisin.
- Kaiken tämän jälkeen voit vihdoin muuttaa luvun takaisin kirjaimeksi. Tässä voit käyttää
chr()funktiota. - Nyt voit vihdoin lisätä kirjaimen tulokseen ja palauttaa salatun tekstin!
Løsning:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# selvitä lähtöpiste kirjainkoon mukaan
start = ord('A') if char.isupper() else ord('a')
# Hankala siirtolaskenta
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
Tehtävä 1.2 - Caesarin salauksen purkaminen
Purkaminen on vain käänteinen laskutoimitus salaukseen verrattuna. Vähennät siirtymän lisäämisen sijaan.
Tips til framgangsmåte.
Käytä tässä tehtävässä luomaasi funktiota. Ota sama funktio, mutta käännä se. Voit tehdä tämän siirtämällä arvon 26 - shift.
Løsning:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
Muita Monoalfabeettisia Salakirjoituksia (esim. Atbash)
On olemassa muitakin monoalfabeettisia salakirjoituksia! Yksi yksinkertaisimmista on niin kutsuttu “Atbash” -salakirjoitus.
Miten Atbash toimii?
Tämä on hyvin yksinkertainen, rotaation sijaan kirjaimet kuvataan vastakkaiseen aakkostoon. Tässä taulukko, joka näyttää kuvauksen:
| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| z | y | x | w | v | u | t | s | r | q | p | o | n | m | l | k | j | i | h | g | f | e | d | c | b | a |
Tehtävä 1.3 - Atbash-salauksen salaus ja purku
Atbashin hieno puoli on se, että koska salaus on 1:1-muunnos, se toimii suoraan käänteisesti. Toisin sanoen, jos olet luonut salauksen, olet myös automaattisesti luonut purun.
Miten tämä voidaan tehdä käytännössä?
Voit joko vähentää kirjaimen arvosta Z, tai luoda “Look-up” -taulukon. Eli taulukon tai sanakirjan, joka sisältää kaikki kirjaimet a:sta z:aan ja mitä niistä tulee. Tämä voi olla hyvä ratkaisu, jos haluatte luoda erilaisen salauksen.
Lookup-table implementasjon.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... lisää loput kirjaimet alaspäin
}
Tämän taulukon avulla voit käydä läpi kirjaimen kerrallaan, hakea arvon kirjaimelle haku-taulukosta ja kirjoittaa sen ulos. Mitä sinun täytyy tehdä isoille ja pienille kirjaimille?
Osa 2 - Monoalfabeettisten salauksen analysointi
Tässä osassa yritätte luoda algoritmin “murtamaan” Caesarin salaus, eli ottamaan salatun tekstin ja palauttamaan alkuperäisen tekstin ilman, että tiedätte avainta.
Tämä voi olla tehty jossain määrin manuaalisesti, tai voit yrittää käyttää yksinkertaista “kryptanalyysiä”. Tämä on käsite, jota tarkastelemme syvällisemmin myöhemmin, mutta nyt tarkastelemme vain yhtä yksinkertaisimmista tavoista: Frekvenssianalyysi (frequency analysis). Voit lukea lisää tästä käsitteestä täältä: Frequency Analysis tai täältä Wikipedia - frequency analysis.
Tätä menetelmää voidaan käyttää muussa kuin Caesarin salauksessa, sitä voidaan käyttää myös monimutkaisemmissa algoritmeissa, mutta Caesarin salaus on niin yksinkertainen, että frekvenssianalyysi on triviaali.
Miten taajuusanalyysi toimii?
Taajuusanalyysi on, kuten nimestäkin voi päätellä, tapa tarkistaa kirjainten esiintymistiheys tekstissä. Miksi tämä voisi olla hyödyllistä? Kuvittele, että sinulla on pitkä teksti, oletetaan englanninkielinen teksti, peräisin Wikipedia - frequency analysis:
In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.
Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.
In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.
Jos muutamme tämän tekstin Caesarin salauksella (ja poistamme pilkut, välilyönnit ja muut erikoismerkit), saamme seuraavan salatekstin:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
Tämä teksti näyttää mahdottomalta murtaa, mutta “taajuusanalyysin” avulla se ei ole vain mahdollista, vaan helppoa.
Tämä on kuva, joka näyttää kirjainten jakauman englanniksi. Kuten voimme nähdä, kirjain E on yleisin kirjain, jota seuraavat T, A ja O.
Tämä voidaan muuttaa taulukoksi ja sitten käyttää laskemaan ja analysoimaan tiettyä salatekstiä, jotta se voidaan “murtaa”. Alla olevissa tehtävissä sinun on luotava ohjelma, joka voi “murtaa” Caesarin salauksen itsenäisesti. On totta, että Caesarin salaus on niin yksinkertainen, että voit vain tarkistaa kaikki 26 mahdollisuutta manuaalisesti, mutta tässä aiomme löytää ratkaisun täysin automaattisesti.
Tehtävä 2.1 - Taajuustaulukon luominen
Luo python-tiedostoon taajuustaulukko englannin kielen kirjaimille. Voit yrittää löytää tämän itse, mutta jos et jaksa, ymmärrämme sen!
Jos todella haluat löytää sen itse, voit tehdä kuten Tehtävässä 2.2, mutta hyvin suurella tekstillä.
English Letter Frequency (Svaret)
english_letter_frequency = {
'E': 12.70,
'T': 9.06,
'A': 8.17,
'O': 7.51,
'I': 6.97,
'N': 6.75,
'S': 6.33,
'H': 6.09,
'R': 5.99,
'D': 4.25,
'L': 4.03,
'C': 2.78,
'U': 2.76,
'M': 2.41,
'W': 2.36,
'F': 2.23,
'G': 2.02,
'Y': 1.97,
'P': 1.93,
'B': 1.29,
'V': 0.98,
'K': 0.77,
'J': 0.15,
'X': 0.15,
'Q': 0.10,
'Z': 0.07
}
Tehtävä 2.2 – Kirjaimien esiintymistiheyden laskeminen tekstissä
Nyt luomme algoritmin, joka laskee kirjaimien esiintymistiheyden annetussa tekstissä.
Tips til framgangsmåte
- Aloita funktiolla, joka ottaa vastaan tekstin (voi olla mitä tahansa).
- Funktiossa luo “dictionary” (Python Dictionaries), jossa on merkinnät jokaiselle aakkosten kirjaimelle, asetettu arvoon
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - Käy läpi koko teksti ja laske jokainen kirjain (lisää 1 vastaavaan merkintään sanakirjassa). Tässä kannattaa ehkä jättää huomiotta merkit, jotka eivät ole kirjaimia, muista myös isot ja pienet kirjaimet.
- Pidä kirjaa siitä, kuinka monta kirjainta on laskettu yhteensä.
- Kun olet valmis laskemaan, jaa
/jokainen arvo taulukossa tekstin pituudella ja kerro sitten 100:lla, tämä antaa sinulle prosentuaalisen esiintymistiheyden. (Voit tietenkin pitää taulukon arvot myös välillä 0 ja 1). - Nyt sinulla pitäisi olla esiintymistiheystaulukko tekstille.
Tehtävä 2.3 – Tekstin frekvensin vertaaminen todelliseen frekvenssiin
Kun olet löytänyt kaikkien tekstin kirjainten frekvenssin, voit luoda funktion, joka löytää “etäisyyden”. Häh? Mitä sillä tarkoitetaan?!
Voit kuvitella, että esimerkiksi kirjaimen E frekvenssi tekstissä on luku. Voit löytää “etäisyyden” tälle verrattuna todelliseen frekvenssiin, joka on 12.70. Esimerkki: Frekvenssi on 9.63, mikä on etäisyys? Etäisyys on näiden kahden arvon välinen absoluuttinen arvo (negatiivisista luvuista tulee positiivisia): \(12.70 - 9.63 = 3.07\).
Luo funktio, joka käy läpi jokaisen kirjaimen ja löytää etäisyyden. Lisää sitten kaikki etäisyydet yhteen “kokonais”etäisyydeksi.
Mattefunktio?
Jos mietit tämän matemaattista funktiota, se näyttää tältä:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
Tips til framgangsmåte
- Käytä
for-silmukkaa käydäksesi läpi koko taajuustaulukon. - Jokaiselle kirjaimelle taajuustaulukossa, etsi absoluuttinen arvo verrattuna todelliseen taajuuteen. Käytä Pythonin
abs()-funktiota tähän. - Summaa kaikki arvot, niin saat lopullisen tuloksen.
Tehtävä 2.4 – “Murtakaa” Caesarin salaus
Nyt yhdistetään kaikki, mitä olemme tähän mennessä tehneet! Nyt “murretaan” Caesarin salaus.
Tee ohjelma, joka “murtaa” Caesarin salauksen! Ilman käyttäjän vaikutusta sinun pitäisi pystyä syöttämään salattu teksti ja hakemaan salattu teksti ilman, että tarvitset avainta.
Test data
Tässä on jotain testidataa, mitä sanotte tästä?
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
Tips til framgangsmåte
- Aloita luomalla funktio, joka ottaa vastaan tekstiä.
- Käytä Caesarin salauksen purkufunktiota, jossa on kierto N tekstissä, N alkaa 0:sta.
- Luo tuloksesta taajuustaulukko.
- Selvitä tuloksen etäisyys todelliseen taajuustaulukkoon verrattuna.
- Joko: a) pidä etäisyys kirjaa listassa, tai b) pidä kirjaa pienimmästä arvosta ja kierrosta (tästä tulee avain).
- Lisää kiertoa yhdellä ja toista vaiheet 2–6, kunnes N saavuttaa 26 (täysi kierto).
- Palauta purettu teksti, eli pienin etäisyys on oikea avain.

