Unlitera Ĉifro

Skip to content

Ĉi tio estas maŝine tradukita teksto kiu povas enhavi erarojn!

Om kriptografiaj taskoj

Ĉi tiuj taskoj estas strukturitaj iomete malsame ol la aliaj taskoj en Piggy, mi iomete scivolas kion vi preferas! 😎

Unue aperos kelkaj informoj pri la temoj, poste aperos kelkaj taskoj!

La “niveloj” en ĉi tiu tasko ne estas tute kiel la antaŭaj niveloj, ĉi tie aferoj estas pli dividitaj en temojn.

Saltu rekte al la taskoj

Kio estas “Ĉifro”?

Ĉu vi iam volis skribi sekretan mesaĝon al amiko, tiel ke neniu alia povus kompreni ĝin? Tiam vi bezonas Ĉifron, aŭ ĉifron en la norvega! Ĉifro estas simple metodo kiu transformas ordinaran tekston en “kodon” per anstataŭigo de signoj (plej ofte literoj) per aliaj signoj. La rezulto ŝajnas senenco por tiuj, kiuj ne scias kiel la kodo funkcias. La celo estas, ke nur tiuj, kiuj konas la ŝlosilon (la regulo por anstataŭigi la literojn) povas fari la kodon komprenebla denove. Kun aliaj vortoj: ĉifroj ebligas sekretajn mesaĝojn, ĉu ĝi estas infaneca ludo kun sekreta lingvo aŭ veraj spionoj kiuj sendas ĉifritajn mesaĝojn. 😄

Ĉu vi sciis?

La vorto “chiffer” fakte devenas de araba vorto: la vorto sifr, kiu signifas “nulo”. Eble ĉar la sekreta kodo ŝajnis esti nenio (nula signifo!) kiam homoj ne povis solvi ĝin!

Ekzistas multaj specoj de ciferoj – kelkaj uzas nombrojn, kelkaj uzas simbolojn, kaj moderna datenkriptado uzas tre komplikitajn algoritmojn. Ĉi tiuj komplikitaj algoritmoj postulas tre komplikitan matematikon, do ni povas rigardi kelkajn pli simplajn algoritmojn unue!

Monoalfabetaj Ĉifroj

Lasu nin unue rigardi kelkajn el la plej simplaj (kaj malnovaj) kodmetodoj kiuj ekzistas: monoalfabetaj ĉifroj.

Monoalfabeta eble ŝajnas kiel malfacila vorto, sed ni povas disigi ĝin: mono signifas “unu”, kaj alfabetaj temas pri la alfabeto.

Do, monoalfabetaj ĉifroj estas kodoj kie oni uzas ununuran “ĉifralfabeton” por la tuta mesaĝo. Tio signifas, ke ĉiu litero en la originala teksto ĉiam estos anstataŭigita per la sama litero tra la tuta ĉifrita mesaĝo.

Ekzemple, se vi decidis, ke A devas esti anstataŭigita per X, tiam ĉiuj A-oj en la teksto estos ŝanĝitaj al X.

Cæzar-Ĉifro

La klasika ekzemplo de monoalfabeta ĉifro estas la Cæzar-ĉifro (nomita laŭ Julio Cezaro). Ĉi tio estas baze regulo pri “ŝovi” ĉiujn literojn certan nombron da lokoj en la alfabeto. Supre dirite, Cezaro mem uzis ŝovon de 3 literoj en siaj sekretaj mesaĝoj. Ĝi funkcias tiel ke A fariĝas D, B fariĝas E, C fariĝas F, kaj tiel plu tra la alfabeto. (Kiam oni pasas preter Z, oni komencas ĉe A denove.) Mesaĝo kiel ABC do fariĝus DEF se ni uzas la metodon de Cezaro.

Neniu atendas mesaĝon en Cezara ĉifro?

Ceasar Cipher Meme

Tiel maniere funkcias Cezara ĉifro en praktiko:

  • Elektu ŝlosilon: Decidu pri sekreta nombro (ekzemple 3) kiu indikas kiom da lokoj vi devas movi ĉiun literon.
  • Anstataŭigu ĉiun literon: Por ĉiu litero en la originala mesaĝo, trovu la literon kiu kuŝas tiom da lokoj post ĝi en la alfabeto (por ŝlosilo 3, A fariĝas D, B fariĝas E, ktp. – memoru iri ĉirkaŭ al A denove post Z se necese). Eble vi ankaŭ povas inkluzivi Æ, Ø kaj Å, sed tio iĝos iomete pli komplika.
  • Ĉifrita mesaĝo: Anstataŭigu la literojn kaj skribu la novan mesaĝon kun la “ŝovitaj” literoj. Ho – vi havas nelegeblan, sekretan tekston kiun nur tiuj kun la ŝlosilo povas kompreni!
  • Por senĉifri (do fari ĝin relegebla teksto denove) oni simple faras la malan ŝovon reen. Se vi scias la ŝlosilon (ekz. 3), tiam estas same facile legi la mesaĝon movante la literojn 3 reen en la alfabeton.

Sikkerhet?

Ti kodoj ne estas aparte sekuraj longtempe. Ĉar la ŝablono (anstataŭigo) estas fiksa, persono kun sufiĉa pacienco aŭ iuj astroj povas facile malkovri la sekreton. Ekzemple, en la Cezara ĉifro ekzistas nur kelkaj eblaj forŝovoj, kiel multaj kiel la alfabeto, do iu ajn povas provi ĉiujn ĝis la mesaĝo estu komprenebla – aŭ uzi litera frekvenco por diveni ĝin. Kun aliaj vortoj, eble ne uzu la Cezaran ĉifron por supersekretaj taglibraj notoj aŭ ŝtataj sekretojn 😉.

Monoalfabetaj ĉifroj estas mirinda maniero lerni la principon malantaŭ ĉifrado. Ili estas simplaj kaj montras kiel ni povas uzi simplan regulon (ŝlosilon) por transformi kompreneblan tekston en ion misteran kaj nekompreneblan – kaj reen denove. Do, sekva fojo kiam vi volas sendi amikon sekretan mesaĝon, vi povas uzi la Cezaran ĉifron! Eble vi povas krei vian propran varianton de la sekreta alfabeto de Cezaro? 🔐✨


Taskoj

Programlingvoj?

Kiel antaŭe, bonvolu uzi ajnan programlingvon laŭ via deziro! La ekzemploj ĉi tie estos en Python.

Medium Tasko 1.1 - Ĉezara Ĉifro Enkriptigo

Nun ni fakte skribu iom da kodo! Ni komencu simple per kreado de la enkriptigo, bazite sur la teorio, ĝi devus esti sufiĉe rekta.

Implementu enkriptigon per Ĉezara Ĉifro per uzo de funkcio kiu prenas tekston kaj numeron kiu estas la “ŝlosilo”, do kiom la alfabeto devas esti rotaciita per.

Tips til framgangsmåte.
  1. Kreu funkcion nomatan caesar kiu prenas la tekston estantan ĉifrita kaj “ŝovon”, do, kiom da lokoj en la alfabeto la teksto estos ŝovita.
  2. Iru tra litero post litero en la teksto.
  3. Ni ne volas “ŝovi” aliajn signojn ol literojn: eltrovu kiel kontroli ĉu signo en la teksto estas litero.
  4. Ni devas “rotacii” la literon kun n lokoj, do ni devas aldoni la rotacion: eltrovu kiel vi povas konverti la tekston al nombroj tiel ke vi povas aldoni la ŝovon. Sugero: la funkcio ord().
  5. Memoru! Vi ricevos malsamajn valorojn bazitajn sur ĉu vi havas malgrandajn aŭ grandajn literojn. Referu al ASCII Tabulo.
  6. Post kiam vi havas valoron, ĝi estas tiel simpla kiel aldoni la n valoron. Sed kio okazas se vi estas ĉe la fino de la alfabeto? Ni nur ricevos sensencaĵon post la litero Z. Kiel tio estas solvitata? Ĉi tio postulas iom da pensado.
Fiksi la ĉifradon.

Por fiksi la ĉifradon tute, ĝi postulas iom da pensado.

  • La unua paŝo por pensi pri estas uzo de la modulo operatoro, %.
  • Ĉar la alfabeto (en la angla) konsistas el 26 literoj, ni povas preni modulon kun 26.
  • Sed ĉi tio ne funkcias tute, ĉu vi vidas la kialon?
  • Provu print la valoron de karaktero kun ord(), kion vi ricevas?
  • Por a vi ricevas 97. Se vi prenas modulon 26 kun ĉi tio, vi ricevas 19. Memoru, ke modulo ĉiam donos respondon inter 0 kaj la nombro.
  • Ĉi tio povas esti solvitata per stokado de la komenca valoro de grandaj kaj malgrandaj literoj, subtrahi ĉi tiun de la litero, kaj poste preni modulon. Tiam ĝi estos: (ord(litero) - ord('a')) % 26
  • Por rekreci la ĝustan literon, vi simple aldonas la komencan valoron denove.
  1. Post ĉio ĉi tio, vi fine povas konverti la numeron reen al litero. Vi povas uzi la funkcion chr() ĉi tie.
  2. Nun vi fine povas aldoni la literon al rezulto kaj redoni la ĉifritan tekston!

Løsning:
def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
        # trovu la startpunkton bazita sur grandliteroj kaj minuskloj
        start = ord('A') if char.isupper() else ord('a')
        # La malfacila ŝovo-kalkulado
        result += chr((ord(char) - start + shift) % 26 + start)
    else:
        result += char
    return result

Easy Tasko 1.2 - Dekodigo de Cezara Ĉifro

Dekodigo estas simple fari la malan kalkulon al la ĉifrado. Vi subtiras la forŝovon anstataŭ aldoni ĝin.

Tips til framgangsmåte.

Uzu la funkcion, kiun vi kreis en tasko 1 por ĉi tio. Nur prenu la saman funkcion, sed inverse. Vi povas fari tion per ŝanĝante la ŝovon je 26 - shift.

Løsning:
def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Solvo:

def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Aliaj Monoalfabetaj Ĉifroj/Ciphers (ekz. Atbash)

Ekzistas aliaj monoalfabetaj ĉifroj ankaŭ! Unu el la plej simplaj estas tiu nomata “Atbash” Ĉifro.

Kiel funkcias Atbash?

Ĉi tiu estas tre simpla, anstataŭ rotacio, la literoj estas mapitaj al la inversa alfabeto. Jen tabelo montranta la mapigon:

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

Medium Tasko 1.3 - Atbash Ĉifro Enkriptigo kaj Malkriptigo

La interesa pri Atbash estas, ke ĉar la enkriptigo estas 1-al-1 transformo, ĝi funkcias rekte inverse. Tio estas, se vi kreis la enkriptigon, vi ankaŭ aŭtomate kreis la malkriptigon.

Kiel ĉi tio povas esti farita en praktiko?

Vi povas aŭ subtrahi la leteron rilate al Z, aŭ krei “Look-up” tablon. Tio signifas tablon aŭ leksikonon kiu enhavas ĉiujn leterojn de a ĝis z kaj kio ili devas fari. Ĉi tio povas esti bona solvo se vi volas krei alian tipon de ĉifrado.

Lookup-table implementasjon.
letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... aldoni la restajn literojn malsupre
}

Per ĉi tiu tabelo, vi povas trairi litero post litero, poste akiri la valoron por ĉiu litero el la serĉtabelo, kaj poste skribi ĝin. Kion vi devas fari por grandaj kaj malgrandaj literoj?


Parto 2 - Kriptanalizo de Monoalfabetaj Ĉifroj

En ĉi tiu parto vi devas provi krei algoritmon por “rompi” Cezaran ĉifron, do preni ĉifritan tekston, poste akiri la originalan tekston sen scii la ŝlosilon.

Tio povas esti farita iomete mane, aŭ vi povas provi uzi simplan “kriptanalizon”. Ĉi tio estas koncepto, kiun ni esploros pli profunde poste, sed nun ni nur rigardos unu el la plej simplaj manieroj: Frekvenca Analizo (frequency analysis). Vi povas legi pli pri ĉi tiu koncepto ĉi tie: Frequency Analysis aŭ ĉi tie Wikipedia - frequency analysis.

Ĉi tiu metodo povas esti uzata en pli ol nur Cezara ĉifro, ĝi povas esti uzata en pli komplikaj algoritmoj ankaŭ, sed Cezara ĉifro estas tiel simpla ke frekvenca analizo estas triviala.

Kiel funkcias frekvencanalizo?

Frekvencanalizo, kiel sugestas la nomo, estas maniero kontroli la frekvenson de literoj en teksto. Kial ĉi tio povus esti utile? Imagu, ke vi havas longan tekston, ni imagu, ke ĝi estas angla teksto, prenita de 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.

Se ni transformas ĉi tiun tekston per Cezara ĉifro (kaj ni forigas komojn, spacojn kaj aliajn specialajn karakterojn), ni ricevas la sekvan ĉifrotekston:

xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz

Ĉi tiu teksto ŝajnas neebla por “krakigi”, sed per “Frekvencanalizo” ĝi ne nur estas ebla, sed facila.

Rigardu la sekvan figuron:
English frequency distribution

Ĉi tio estas figuro, kiu montras la distribuon de literoj en la angla. Ni povas vidi, ke la litero E estas la plej ofta litero, sekvita de T, A kaj O.

Ĉi tio povas esti transformita en tabelon kaj poste uzata por kalkuli kaj analizi donitan ĉifrotekston por poste “krakigi” ĝin. En la taskoj sube, vi devas krei programon, kiu povas “krakigi” Cezaran ĉifron memstare. Estas vero, ke Cezara ĉifro estas tiel simpla, ke vi povas simple kontroli ĉiujn 26 eblojn mane, sed ĉi tie ni volas trovi la solvon, tute aŭtomate.

Easy Tasko 2.1 - Kreadi frekvencotabelon

En python-dosiero, krei frekvencotabelon de la literoj en la angla lingvo. Vi povas provi trovi ĝin mem, sed se vi ne volas fari tion, ni komprenas!

Se vi absolute volas trovi ĝin mem, vi povas fari kiel en Tasko 2.2, sed sur tre granda teksto.

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
}

Medium Tasko 2.2 - Kalkuli la frekvenson de literoj en teksto

Nun ni kreu algoritmon kiu trovos la frekvenson de literoj en donita teksto.

Tips til framgangsmåte
  1. Komencu per funkcio kiu prenas kiel eniron tekston (ĝi povas esti kio ajn).
  2. En la funkcio, kreu “vortaron” (Python Dictionaries), kun eniroj por ĉiu litero de la alfabeto, agorditaj al 0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0})
  3. Trairu la tutan tekston kaj nombru ĉiun literon (pligrandigu je 1 la respondan eniron en la vortaro). Vi devus probable ignori signojn kiuj ne estas literoj, memoru ankaŭ grandajn kaj malgrandajn literojn.
  4. Zorgu pri tio, kiom da literoj estis nombritaj totale.
  5. Kiam vi estos finita kun la nombradon, dividu / ĉiun valoron en la tabelo per la longo de la teksto kaj poste multobligu per 100, ĉi tio donos al vi procentan frekvenson. (Vi povas kompreneble ankaŭ lasi vian tabelon esti inter 0 kaj 1).
  6. Nun vi devus havi frekvencan tabelon por la teksto.

Medium Tasko 2.3 - Kompari la frekvenson de teksto kun la vera frekvenco

Kiam vi trovis la frekvenson de ĉiuj literoj en la teksto, ni povas krei funkcion, kiu trovas la “distancon”. Kio?! Kion oni celas per tio?!

Vi povas imagi, ke la frekvenco de ekzemple E en la teksto estos nombro. Ni povas trovi la “distancon”, kiun ĝi havas kun la fakta frekvenco, kiu estas 12.70. Ekzemplo: La frekvenco estas 9.63, kia estas la distanco? La distanco estos la absoluta valoro (negativaj nombroj iĝas pozitivaj) inter tiuj du valoroj: \(12.70 - 9.63 = 3.07\).

Kreu funkcion, kiu trairas ĉiun el la literoj kaj trovas la distancon. Poste adiciu ĉiujn distancojn kune al “totala” distanco.

Matematika funkcio?

Se vi demandas kiel la matematika funkcio por ĉi tiu estas, ĝi aspektas jene:

\(\sum_{n=0}^{N} \lvert a - b\rvert\)

Tips til framgangsmåte
  1. Uzu for-buŝon por trairi la tutan frekvenc-tabelon.
  2. Por ĉiu litero en la frekvenc-tabelo, trovu la absolutan valoron kompare al la fakta frekvenco. Uzu la funkcion abs() en Python por tio.
  3. Sumigu ĉiujn valorojn, kaj vi ricevos la finan rezulton.

Hard Tasko 2.4 - “Krakante” Cezara Ĉifro

Nun ni fine kunmetu ĉion, kion ni faris ĝis nun! Nun ni “krakante” Cezara Ĉifron.

Kreu programon, kiu “krakas” Cezara Ĉifron! Sen uzantaj influoj, vi devas povi enigi ĉifritan tekston kaj ricevi la malĉifritan tekston sen bezoni ŝlosilon.

Test data

Jen estas iom da testdatumoj, kiujn vi povas uzi, kion diras ĉi tiuj?

Test-data
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha

Tips til framgangsmåte
  1. Komencu per krei funkcion kiu akceptas tekston.
  2. Uzu la dekriptigan funkcion por Cezara ĉifro kun rotacio N sur la tekston, N komencas je 0.
  3. Kriu frekvencotabelon de la rezulto
  4. Trovu la distancon al la rezulto rilate al la fakta frekvencotabelo
  5. Aŭ: a) tenu spuron de la distanco en listo, aŭ b) tenu spuron de la plej malgranda valoro kaj la rotacio (ĉi tio estos la ŝlosilo)
  6. Pliigu la rotacion je 1 kaj ripetu paŝon 2 ĝis 6 ĝis kiam N atingas 26 (plena rotacio).
  7. Redonu la dekriptitan tekston, do la plej malgranda distanco estas la ĝusta ŝlosilo.