Ĉ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.
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.
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.
Sekureco?
Tiuj ĉi kodoj ne estas tre sekuraj longtempe. Ĉar la modelo (la substituo) estas fiksa, person kun sufiĉa pacienco aŭ kelkaj inteligentaj truoj povas rapide malkovri la sekreton. Ekzemple, ekzistas nur kelkaj eblaj dekaladoj en la Cezara ĉifro, same multaj kiel la alfabeto, do iu ajn povas provi ĉiujn ĝis la mesaĝo fariĝas inteligibla – aŭ uzi vokal-frekuencojn por divenante. Alian vorton, eble ne uzu la Cezaran ĉifron por supersekretaj taglibraj notoj aŭ ŝtata sekretoj 😉.
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.
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.
Konsiloj pri la proceduro.
- Kreu funkcion nomatan
caesar, kiu ricevas la tekston por ĉifri kaj “ŝifton”, do, kiom da pozicioj en la alfabeto la teksto devas ŝiftiĝi. - Trairu la tekston leteron post letero.
- Ni ne volas “ŝifti” aliajn signojn ol leterojn: trovu kiel vi kontrolas, ke signo en la teksto estas letero.
- Ni devas “rotaci” la leteron kun n pozicioj, do ni devas aldoni la rotacion: trovu kiel vi povas transformi la tekston al nombroj por ke vi povu aldoni la ŝifton. Sugesto: la funkcio
ord(). - Memoru! Jen vi ricevas diversajn valorojn bazgite sur tio, ĉu vi havas malgrandajn aŭ grandajn leterojn. Referencu la ASCII Tabelon.
- Post kiam vi havas valoron, estas tiel simple kiel aldoni n al la valoro. Sed kio okazas, se vi estas ĉe la fino de la alfabeto? Ni ricevos nur babilaĵon post la letero Z. Kiel tio estas ripari? Tio postulas iom da pripensado.
Ripari la ĉifradon.
Por tute ripari la ĉifradon, necesas iom da pripensado.
- La unua paŝo por pripensi estas uzo de la modulo operaciilo,
%. - Ĉar la alfabeto (angle) konsistas el 2legaj leteroj, ni povas apliki modulo kun
26. - Sed tio ne funkcias tute bone, ĉu vi vidas la kialon?
- Provu
printeligi la valoron de karaktero perord(), kion vi ricevas? - Por
avi ricevas 97. Se vi aplikas modulo 26 al tio, vi ricevas 19. Memoru, ke modulo ĉiam donos respondon inter 0 kaj la nombro. - Tio povas esti ripari per konservado de la komencvaloro de grandaj kaj malgrandaj leteroj, subtrako de tiu el la letero, kaj poste apliki modulo. Tiam ĝi fariĝas:
(ord(letero) - ord('a')) % 26 - Por rehavi la ĝustan leteron, vi simple denove aldonas la komencvaloron.
- Post ĉio ĉi, vi finfine povas denove transformi la nombron al letero. Jen vi povas uzi la funkcion
chr(). - Nun vi finfine povas aldoni la leteron al rezulto kaj redoni la ĉifritan tekston!
Solvo:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# trovu la komencan punkton bazgite sur majusklojoj kaj minuskuloj
start = ord('A') if char.isupper() else ord('a')
# La malfacila ŝifta kalkulado
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
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.
Konsiloj pri proceduro.
Uzu la funkcion, kiun vi kreis en tasko 1 por tio. Simple uzu la saman funkcion, sed inverse. Vi povas fari tion per ŝanĝo de shift ĉe 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 |
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-tablo implementado.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... aldonu la restante de la literoj malsupren
}
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.
Ĉ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.
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
}
Tasko 2.2 - Kalkuli la frekvenson de literoj en teksto
Nun ni kreu algoritmon kiu trovos la frekvenson de literoj en donita teksto.
Konsiloj pri proceduro
- Komencu per funkcio, kiu ricevas tekston (kio ajn povas esti).
- En la funkcio, kreu “dictionary” (Python Dictionaries), kunhavante enirojn por ĉiu litero de la alfabeto, agorditajn al
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - Trairu la tutan tekston kaj kalkulu ĉiun ununuran literon (okumentu per +1 en la koncernan eniron en la dictionary). Ĉi tie vi devus ignori signojn, kiuj ne estas literoj, kaj memori ankaŭ majuskulojn kaj minuskulojn.
- Spure kiom da literoj estis totale kalkulitaj.
- Kiam vi finos kalkuli, dividu
/ĉiun valoron en la tabelo per la longo de la teksto kaj poste multipliku per 100; tio donos al vi procentan frekvencon. (Vi povas komprene ankaŭ lasi vian tabelon esti inter 0 kaj 1). - Nun vi havos frekvenca-tabelon por la teksto.
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\)
Konsiloj pri proceduro
- Uzu
for-loop-on por trairi la tutan frekvenca-tabulon. - Por ĉiu litero en la frekvenca-tabulo, trovu la absoluta-valoron kompare kun la fakta frekvenco. Uzu la
abs()funkcion en Python por tio. - Sumu ĉiujn valorojn, tiam vi ricevos la finan rezulton.
Tasko 2.4 - “Krakado” de Cezara ĉifro
Nun ni fine kunigu ĉion, kion ni faris ĝis nun! Nun ni krakos Cezaran ĉifron.
Kreu programon, kiu “krakas” Cezaran ĉifron! Sen influo de la uzanto, vi devas povi enmeti ĉifritan tekston kaj eltiri la dekryptitan tekston sen bezono de ŝlosilo.
Test data
Jen estas iom da testdatumoj, kiujn vi povas uzi, kion diras ĉi tiuj?
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
Konsiloj pri proceduro
- Komencu kreante funkcion, kiu ricevas tekston.
- Uzu la dekryptan-funkcion por Cezara ĉifro kun rotacio N sur la teksto, N komencas de 0.
- Kreu frekvenc-tabulon de la rezulto.
- Trovu la distancon de la rezulto rilate al la fakta frekvenc-tabulo.
- Agordu: a) spure la distancon en listo, aŭ b) spure la plej malgrandan valoron kaj la rotacion (ĉi tio fariĝos la ŝlosilo).
- Augmentu la rotacion kun 1 kaj ripetu paŝojn 2 ĝis 6 ĝis N atingas 26 (plena rotacio).
- Redonu la dekryptitan tekston, do la plej malgranda-distanco estas la ĝusta ŝlosilo.

