Dette er ein maskinomsett tekst som kann innehalda feil!
Om kryptografioppgåvene
Desse oppgåvene er strukturerte litt annleis enn dei andre oppgåvene på Piggy, lurar litt på kva de føretrekk! 😎
Det vil fyrst koma ein del informasjon til å byrja med om temaa, deretter vil det koma nokre oppgåver etterpå!
«Nivåa» i denne oppgåva er ikkje heilt som nivåa før, her er ting meir delt opp i tema.
Kva er eit “Cipher”?
Har du nokon gong hatt lyst til å skriva ei hemmeleg melding til ein ven, slik at ingen andre kan forstå ho? Då treng du eit Cipher, eller chiffer på Norsk! Eit chiffer er rett og slett ei metode som gjer vanleg tekst om til “kode” ved å byta ut teikn (ofta bokstavar) med andre teikn. Resultatet ser ut som tull for dei som ikkje veit korleis koden fungerer. Poenget er at berre dei som kjenner nøkkelen (regelen for å byta ut bokstavane) kan gjera koden forståeleg att. Med andre ord: chiffer gjer hemmelege meldingar mogleg, anten det er barndommens lek med hemmeleg språk eller ekte spionar som sender krypterte meldingar. 😄
Visste du?
Ordet «chiffer» stammar faktisk frå eit arabisk ord: ordet sifr, som tyder «null». Kanskje fordi den hemmelege koden så ut som ingenting (null meining!) når folk ikkje kunne løyse han!
Det finst mange slag av chiffer – nokre nyttar tal, nokre nyttar symbol, og moderne datakryptering nyttar svært kompliserte algoritmar. Desse kompliserte algoritmane krev svært komplisert matematikk, so me kan sjå på nokre enklare algoritmar fyrst!
Monoalfabetiske Chiffer
Lat oss fyrst sjå på nokre av dei enklaste (og eldste) kodemetodane som finst: monoalfabetiske chiffer.
Monoalfabetisk høyrast kanskje ut som eit vanskeleg ord, men me kan dele det opp: mono tyder “ein”, og alfabetisk handlar om alfabetet.
Altså, monoalfabetiske chiffer er koder der ein brukar eit enkelt “krypteringsalfabet” for heile meldinga. Det vil seia at kvar bokstav i den originale teksten alltid vert bytt ut med den same bokstaven gjennom heile den krypterte meldinga.
For døme, har du bestemt at A skal bytast med X, då vert alle A-ane i teksten gjort om til X.
Cæsar-chiffer
Det klassiske dømet på eit monoalfabetisk chiffer er Cæsar-chifferet (kalla opp etter Julius Cæsar). Dette er i botnen ei regel om å «skifte» alle bokstavane eit visst tal plassar bortover i alfabetet. Visstnok så brukte Cæsar sjølv eit skifte på 3 bokstavar i sine hemmelege meldingar. Det verkar slik at A vert til D, B vert til E, C vert til F, og so vidare gjennom alfabetet. (Når ein går forbi Z, startar ein på A att.) Ei melding som ABC ville dermed verte til DEF om me brukar Cæsars metode.
Slik verkar Cæsar-chifferet i praksis:
- Vel ein nøkkel: Bestem deg for eit hemmeleg tal (til dømes 3) som angir kor mange plassar du skal flytta kvar bokstav.
- Bytt ut kvar bokstav: For kvar bokstav i den opphavlege meldinga, finn bokstaven som ligg så mange plassar etter han i alfabetet (for nøkkel 3 vert A til D, B til E, osv. – hugs å gå rundt til A att etter Z om naudsynt). Eventuelt kan du òg taka med Æ, Ø og Å, men dette vert litt meir komplisert.
- Kryptert melding: Erstatt bokstavane og skriv den nye meldinga med dei “skifte” bokstavane. Vips – du har ein uleseleg, hemmeleg tekst som berre dei med nøkkelen kan forstå!
- For å dekryptera (altså gjera det om til leseleg tekst att) gjer ein berre det motsette skiftet tilbake. Om du veit nøkkelen (t.d. 3), så er det like lett å lesa meldinga ved å flytta bokstavane 3 tilbake i alfabetet.
Sikkerhet?
Desse kodane er ikkje særleg sikre i lengda. Fordi mønsteret (substitusjonen) er fast, kan ein person med nok tolmod eller nokon smarte triks lett avsløra hemmelegdomen. Til dømes finst det berre nokre få moglege forskyvingar i Cæsar-chifferet, like mange som alfabetet, så kvar som helst kan prøva alle til meldinga gjev meining – eller bruka bokstavfrekvensar til å gjette seg fram. Med andre ord, kanskje ikkje bruk Cæsar-chifferet for superhemmelege dagboknotat eller statshemmeligheiter 😉.
Monoalfabetiske chiffer er ein fantastisk måte å lære prinsippet bak kryptering. Dei er enkle og syner korleis me kan bruke ei enkel regel (ein nøkkel) til å gjere om ein forståeleg tekst til noko mystisk og uforståeleg – og attende igjen. So neste gong du vil senda ein ven ein hemmeleg bodskap, kan du bruke Cæsar-chifferet! Kanskje de kan lage dykkar eiga variant av Cæsars hemmelege alfabet? 🔐✨
Oppgåver
Programmeringsspråk?
Som før, bruk gjerne kvitt programmeringsspråk du vil! Døma her vil vera i Python.
Oppgåve 1.1 – Cæsar Chiffer Kryptering
No skal me faktisk skriva noko kode! Me skal byrja enkelt med å laga krypteringa, basert på teorien bør det vera ganske rett fram.
Implementer kryptering med Cæsar Chiffer ved å bruka ei funksjon som tek inn tekst og eit tal som er «nøkkelen», altså kor mykje alfabetet skal roterast med.
Tips til framgangsmåte.
- Lag ei funksjon som heiter
caesarsom tek inn teksten som skal krypterast og eit “shift”, altså kor mange plassar i alfabetet teksten skal forskyvast. - Gå gjennom bokstav for bokstav i teksten.
- Me vil ikkje “forskyve” andre teikn enn bokstavar: finn ut korleis du kan sjekke at eit teikn i teksten er ein bokstav.
- Me skal “rotere” bokstaven med n plassar, altså me må leggje til rotasjonen: finn ut korleis du kan gjere teksten om til tal slik at du kan leggje til shiftet. Hint:
ord()funksjonen. - Husk! Her får du forskjellige verdiar basert på om du har små eller store bokstavar. Referer til ASCII Tabellen.
- Etter du har ei verdi er det så enkelt som å leggje til n verdien. Men kva skjer dersom du er på slutten av alfabetet? Me får berre tull etter bokstaven Z. Korleis blir dette fiksa? Dette krev litt tenking.
Fikse enkrypteringa.
For å fikse krypteringa heilt krev litt tenking.
- Det første steget å tenke på er bruk av modulus operatoren,
%. - Sidan alfabetetet (på engelsk) består av 26 bokstavar, kan me ta modulus med
26. - Men dette fungerer ikkje heilt, ser du grunnen?
- Prøv å
printut verdien til ein karakter medord(), kva får du? - For
afår du 97. Hvis du tar modulus 26 med dette, får du 19. Husk at modulus vil alltid gi eit svar mellom 0 og talet. - Dette kan fikses ved å lagre startverdien til store og små bokstavar, trekke denne frå bokstaven, og deretter ta modulus. Då blir det:
(ord(bokstav) - ord('a')) % 26 - For å få tilbake den rette bokstaven legg du berre til startverdien igjen.
- Etter alt dette kan du endeleg gjere talet om til ein bokstav igjen. Her kan du bruke
chr()funksjonen. - No kan du endeleg leggje bokstaven til eit resultat og returnere den krypterte teksten!
Løsning:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# finn ut startpunktet basert på store og små bokstaver
start = ord('A') if char.isupper() else ord('a')
# Den vanskelige shifte-utregningen
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
Oppgåve 1.2 – Cæsar Chiffer Dekryptering
Dekryptering er berre å gjera den motsette utrekninga til enkryptering. Du trekkjer frå offset i staden for å leggja til.
Tips til framgangsmåte.
Bruk funksjonen du laga i oppgåve 1 for dette. Berre tak same funksjonen, men i revers. Dette kan du gjera ved å gjera skift om ved 26 - skift.
Løsning:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
Andre Monoalfabetiske Chiffer/Ciphers (ex. Atbash)
Det finst andre monoalfabetiske chiffer òg! Ein av dei enklare er den som vert kalla “Atbash” Chiffer.
Korleis verkar Atbash?
Denne er svært enkel, i staden for ein rotasjon så vert bokstavar kartlagde til det motsette alfabetet. Her er ei tabell som syner kartleggingi:
| 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 |
Oppgåve 1.3 - Atbash Chiffer Kryptering og Dekryptering
Det kjekke med Atbash er at sidan kryptering er ein 1 til 1 transformasjon, so fungerer han direkte i revers. Altså, um du har laga krypteringa, so har du óg, automatisk laga dekrypteringa.
Korleis kan dette gjerast i praksis?
Du kan anten trekke frå bokstaven i høve til Z, eller lage ein «Look-up» tabell. Altså, det tyder ei tabell eller ordbok som innhald alle bokstavane frå a til z og kva dei skal verte. Dette kan vera god løysing dersom de vil lage ein annan type kryptering.
Lookup-table implementasjon.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... legg til resten av bokstavene nedover
}
Ved hjelp av denne tabellen kan du gå igjennom bokstav for bokstav, so hente ut verdiin per bokstav frå oppslagstabellen, so skrive han ut. Kva må du gjera for store og små bokstavar?
Del 2 - Kryptoanalyse av Monoalfabetiske Chiffer
I denne delen skal dykk prøva å laga ein algoritme for å «cracke» ein Cæsar-chiffer, altså taka ein kryptert tekst, deretter, få ut den originale teksten utan å vita nøkkelen.
Dette kan gjerast noko manuelt, eller så kan du prøva å taka i bruk enkel «cryptanalysis». Dette er eit konsept som vi skal sjå djupare på seinare, men for no skal vi berre sjå på ein av dei enklaste måtane: Frekvensanalyse (frequency analysis). Du kan lesa meir om dette konseptet her: Frequency Analysis eller her Wikipedia - frequency analysis.
Denne metoden kan brukast i meir enn berre Cæsar-chiffer, ho kan brukast i meir kompliserte algoritmar også, men Cæsar-chiffer er såpass enkel at frekvensanalyse er triviell.
Korleis fungerer frekvensanalyse?
Frekvensanalyse er, som namnet hintar til, ein måte å sjekke frekvensen av bokstavar i ein tekst. Kvifor kan dette vere nyttig? Sjå føre deg at du har ein lang tekst, me skal sjå føre oss ein engelsk tekst, henta frå 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.
Dersom me tek å gjer denne teksten om ved Cæsar chiffer (også tek me vekk komma, mellomrom og andre spesielle teikn), får me følgjande chiffer-tekst:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
Denne teksten ser jo umuleg ut å “cracke”, men ved hjelp av “Frekvens-analyse” er det ikkje berre mogleg, men enkelt.
Dette er ein figur som viser distribusjonen av bokstavar på engelsk. Det me kan sjå, er at bokstaven E er den hyppigaste bokstaven, etterfølgt av T, A og O.
Denne kan gjerast om til ein tabell og så brukast til å telle og analysere ein gitt chiffer-tekst for så å “cracke” den. I oppgåvene under skal du lage eit program som kan “cracke” ceasar chiffer på eiga hand. Det er sant at cæsar-chifferet er så enkelt at du kan berre sjekke alle 26 moglegheitene manuelt, men her skal me finne ut løysinga, heilt automatisk.
Oppgåve 2.1 – Laga ein frekvenstabell
I ei python-fil, skap ein frekvenstabell av bokstavane i det engelske språket. Du kann prøva å finna denne sjølv, men um du ikkje gidder dette, forstår me det!
Um du absolutt ynskjer å finna den sjølv, kann du gjera som i Oppgåve 2.2, men på ein veldig stor tekst.
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
}
Oppgåve 2.2 – Telja frekvensen av bokstavar i tekst
No skal me laga ein algoritme som skal finna frekvensen av bokstavar i ein gjeven tekst.
Tips til framgangsmåte
- Byrj med ein funksjon som tek inn ein tekst (kan vera kva som helst).
- I funksjonen, skap ein «dictionary» (Python Dictionaries), med oppføringar for kvar bokstav i alfabetet, sett til
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - Gå igjennom heile teksten og tel kvar einaste bokstav (auk med 1 i tilsvarande oppføring i ordboka). Her bør du nok ignorera teikn som ikkje er bokstavar, hugs også store og små bokstavar.
- Halde styr på kor mange bokstavar som har vorte telt totalt.
- Når du er ferdig med å telja, del
/kvar verdi i tabellen med lengda av teksten og så gang med 100, dette vil gje deg ein prosent-frekvens. (Du kan sjølvsagt heller la tabellen din over vera mellom 0 og 1). - No skal du ha ei frekvenstabell for teksten.
Oppgåve 2.3 – Samanlikne frekvensen av ein tekst med den ekte frekvensen
Når du har funne frekvensen til alle bokstavane i teksten, kan du lage ein funksjon som finn «avstanden». Kva meinar me med det?
Du kan sjå føre deg at frekvensen til til dømes E i teksten kjem til å vere eit tal. Du kan finne «avstanden» denne har med den faktiske frekvensen, som er 12.70. Døme: Frekvensen er 9.63, kva er avstanden? Avstanden kjem til å vere den absolutte verdien (negative tal vert positive) mellom desse to verdiane: \(12.70 - 9.63 = 3.07\).
Lag ein funksjon som går igjennom kvar av bokstavane og finn avstanden. Legg deretter alle avstandane saman til ein «total» avstand.
Mattefunksjon?
Um du undrast korleis matte-funksjonen for denne er, so ser ho slik ut:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
Tips til framgangsmåte
- Bruk ein
for-lykkje til å gå gjennom heile frekvenstabellen. - For kvar bokstav i frekvenstabellen, finn absoluttverdien samanlikna med den faktiske frekvensen. Bruk
abs()funksjonen i Python for dette. - Legg saman alle verdiane, så skal du få eit slutt-resultat.
Oppgåve 2.4 – «Knekke» Cæsar-chiffer
No skal me til slutt setje saman alt me har gjort så langt! No skal me «knekke» eit Cæsar-chiffer.
Lag eit program som «knekker» eit Cæsar-chiffer! Utan brukaren si innverknad skal du kunne hive inn ein kryptert tekst og hente ut den dekrypterte teksten utan å trenge ein nøkkel.
Test data
Her er noko test-data de kan bruka, kva seier desse?
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
Tips til framgangsmåte
- Byrj å laga ein funksjon som tek inn tekst.
- Bruk dekrypterings-funksjonen for Cæsar-chiffer med rotasjon N på teksten, N byrjar på 0.
- Lag ei frekvenstabell av resultatet
- Finn ut avstanden til resultatet i høve til den faktiske frekvenstabellen
- Enten: a) hald styr på avstanden i ei liste, eller b) hald styr på den minste verdien og rotasjonen (dette vert nøkkelen)
- Auk rotasjonen med 1 og repeter steg 2 til 6 heilt til N når 26 (full rotasjon).
- Returner den dekrypterte teksten, altså den minste-avstanden er den rette nøkkelen.

