Kalo te përmbajtja

9 min lexim

American Corners

Shifra e Cezarit: një mini-laborator

Nga variablat te mesazhet sekrete

Në seancën e parë, para se të vizatonim qoftë edhe një vijë të vetme me Turtle, të treguan një sfidë në HackerRank që quhej "password cracker", thyerja e fjalëkalimeve. Batuta ishte ta linim rehat për momentin. Në fund të këtij mësimi do të kesh ndërtuar anën tjetër të asaj historie: një program të vogël që fsheh një mesazh që të mos lexohet me një shikim, dhe pastaj e zbulon sërish.

Për këtë na duhet një ide që e ke takuar tashmë. Një varg (string) është thjesht tekst i ruajtur në një variabël, si message = "Happy birthday!" nga leksioni i parë. Ajo që nuk e thamë atëherë është se një varg në të vërtetë është një sekuencë karakteresh, një shkronjë pas tjetrës, dhe Python të lejon t'i përshkosh një nga një, pikërisht ashtu siç një cikël for përshkon një varg numrash.

Kthimi i një teksti të lexueshëm në tekst të përzier me qëllim, që vetëm dikush me sekretin ta rikthejë, quhet enkriptim. Shifra e Cezarit është truku më i vjetër në këtë fushë, që mban emrin e Jul Cezarit, i cili e përdorte për të mbrojtur urdhrat e tij ushtarakë.

Ideja e shifrës së Cezarit

Rregulli është thuajse tepër i thjeshtë. Zgjidh një numër, të quajtur zhvendosje. Pastaj çoje çdo shkronjë përpara në alfabet me atë numër hapash.

Me një zhvendosje prej 3, A bëhet D, B bëhet E, C bëhet F, e kështu me radhë. Fjala HELLO kthehet në KHOOR. Për ta lexuar sërish, e zhvendos çdo shkronjë po aq hapa mbrapsht.

Ka vetëm një gjë për t'u kujdesur. Kur del jashtë fundit të alfabetit, kthehesh në fillim. Me një zhvendosje prej 3, X bëhet A, Y bëhet B, Z bëhet C. Alfabeti sillet si një rreth, jo si një vijë e drejtë.

Ky kthim rrethor është i gjithë problemi kur e shkruajmë në kod. Gjithçka tjetër është një cikël mbi karakteret.

Ndërtimi, një karakter në një kohë

Një zakon i mirë nga mësimi i funksioneve është të zgjidhësh më parë problemin më të vogël. Këtu problemi më i vogël është: zhvendos një karakter të vetëm. Sapo të funksionojë një shkronjë, një cikël e mbaron pjesën tjetër.

Python na jep dy ndihmës për këtë. ord("A") kthen numrin që kompjuteri përdor për një karakter (65 për A të madhe), dhe chr(65) e kthen atë numër sërish në karakter. Kështu mund të bëjmë veprime aritmetike me shkronjat duke i kthyer në numra, duke i zhvendosur, dhe duke i kthyer prapa.

def shift_character(ch, shift):
    if ch.isalpha():
        base = ord("A") if ch.isupper() else ord("a")
        return chr((ord(ch) - base + shift) % 26 + base)
    return ch

Lexoje ngadalë. base është numri i shkronjës së parë, A për të mëdhatë ose a për të voglat, që ord(ch) - base të na japë një pozicion të pastër nga 0 deri në 25 në vend të një kodi të papërpunuar. I shtojmë zhvendosjen, marrim mbetjen pas pjesëtimit me 26 me % 26 (ky është kthimi rrethor), pastaj i shtojmë base prapa për t'u kthyer te shkronjat e vërteta. Çdo gjë që nuk është shkronjë, një hapësirë ose një numër, kthehet e paprekur.

Tani cikli. Enkriptimi i një mesazhi të tërë do të thotë thjesht të zhvendosësh çdo karakter dhe t'i bashkosh rezultatet në një varg të ri.

def encrypt(text, shift):
    return "".join(shift_character(c, shift) for c in text)

Le ta provojmë me diçka nga vendi ynë.

print(encrypt("See you Saturday", 3))
# -> Vhh brx Vdwxugdb

print(encrypt("MEET AT 11", 3))
# -> PHHW DW 11

Vëre që hapësira dhe shifrat 11 kaluan të paprekura, pikërisht siç premtoi ndihmësi ynë.

Praktikë

Hap repl.it, shkruaj të dy funksionet e mësipërme, dhe enkripto emrin tënd me një zhvendosje prej 5. Pastaj jepja versionin e përzier dhe numrin 5 personit pranë teje dhe shih nëse mund ta rikthejë emrin tënd. Pikërisht ai dorëzim i numrit sekret është pika e dobët e gjithë sistemit.

Deshifrimi: zhvendos nga ana tjetër

Nëse enkriptimi i çon shkronjat përpara, deshifrimi thjesht i çon mbrapsht. Pjesa e bukur është se nuk na duhet asnjë kod i ri. Zhvendosja mbrapsht me 3 është e njëjta gjë me zhvendosjen përpara me minus 3, dhe % 26 në ndihmësin tonë i trajton numrat negativë saktë.

def decrypt(text, shift):
    return encrypt(text, -shift)

Kështu udhëtimi i plotë, vajtje-ardhje, duket kështu:

secret = encrypt("Takohemi te sheshi", 3)
print(secret)
# -> Wdnrkhpl wh vkhvkl

print(decrypt(secret, 3))
# -> Takohemi te sheshi

Mesazhi doli i përzier dhe u kthye i plotë.

Ja edhe e keqja e sinqertë, dhe arsyeja pse ky është një laborator dhe jo siguri e vërtetë. Ka vetëm 25 zhvendosje të dobishme. Një kompjuter i provon të gjitha brenda një çasti dhe e lexon mesazhin pa iu treguar kurrë numri. Prandaj shifra e Cezarit është një lodër, ndërsa enkriptimi që mbron aplikacionin e bankës mbështetet te çelësa aq të mëdhenj sa provimi i të gjithëve do të zgjaste më shumë se mosha e universit.

Këtu tregon edhe fija përshkuese përpara. Ajo sfida e parë "password cracker" kishte të bënte me një makinë që merr me mend sekrete duke provuar mundësi. Më vonë në kurs do të takosh PassGAN, ku një IA moderne mëson të marrë me mend fjalëkalime ashtu si i shkruajnë vërtet njerëzit. Shifra e Cezarit është vështrimi yt i parë e miqësor te ajo garë mes fshehjes së një sekreti dhe zbulimit të tij.

Para se të vazhdosh, provoje drejtpërdrejt më poshtë: shkruaj një mesazh, tërhiq zhvendosjen, dhe shihe si përzihet e kthehet i plotë, pastaj jepi makinës të 25 zhvendosjet njëherësh dhe shih sa shpejt bie një sekret i Cezarit.

Laborator i shifrës së Cezarit

I enkriptuar

Wdnrkhpl wh vkhvkl

I deshifruar prapa

Takohemi te sheshipërputhet me origjinalin

Të 25 zhvendosjet

Shtyp “Provo të 25-tat” për ta thyer këtë tekst, ashtu si do të bënte një kompjuter.

Provo veten

Punoji këto me fjalët e tua para se të vazhdosh.

  1. Me një zhvendosje prej 1, në ç'shkronjë kthehet Z, dhe cila rresht i shift_character po bën punën që e bën këtë të mundur?
  2. E shkruam decrypt në një rresht të vetëm që thërret encrypt. Me fjalë të thjeshta, pse zhvendosja mbrapsht me 3 është e njëjta gjë me zhvendosjen përpara me minus 3?
  3. Nëse një shok të dërgon një mesazh të enkriptuar me Cezarin por harron të të thotë zhvendosjen, a do të mund ta lexoje prapëseprapë? Shpjego çfarë do të provoje, dhe çfarë të tregon kjo për sa e sigurt është vërtet kjo shifër.

Nga vjen ky mësim

Ndërtuar mbi

  • Programming in a Data World: Leksioni 3, punimi me vargje / shifra e Cezarit
  • Leksioni 1 (variablat dhe vargjet) dhe grupi i mjeteve funksione/cikle
  • Fjalori: enkriptim

Kurset e alphaPlan ndërtohen mbi programe të zhvilluara në klasë, e nuk shpiken për web-in. Kur një pohim mbështetet mbi një standard të jashtëm ose mbi një rast të raportuar, ai emërtohet më sipër që ta kontrollosh vetë e të mos na besosh në fjalë.

Ky kurs u zhvillua nga alphaPlan Center mbi bazën e programeve të realizuara në partneritet me rrjetin American Corners.

Gjete diçka të paqartë, të vjetruar ose që mund të përmirësohet? Sugjero një përmirësim