Sekretne Wiadomości
Transkrypt
Sekretne Wiadomości
Python 2 Sekretne Wiadomości KażdyKlubKodowaniamusibyćzarejestrowany.Zarejestrowaneklubymożna zobaczyćnamapienastroniecodeclubworld.org-jeżeliniematamtwojegoklubu sprawdźnastroniejumpto.cc/18CpLPy(ang.)cotrzebazrobić,bytozmienić. Wprowadzenie: Wtymprojekcienauczyszsięjaknapisaćswójwłasnyprogram szyfrujący,którymbędziemożnawysyłaćtajnewiadomoścido przyjaciół. Zadaniadowykonania WykonajtePOLECENIAkrokpokroku Przetestujswójprojekt Kliknijnazielonąflagę,aby PRZETESTOWAĆswójkod Zapiszswójprojekt TerazZAPISZswójprojekt 1 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Krok1:Szyfrowanieliter Szyfrowaniejesttypemtajnegokodu,wktórymzamieniasięliterytak, abyniktniepożądanyniemógłodczytaćwiadomości.Będziemyużywać najstarszejinajbardziejznanejmetodyszyfrowania,szyfruCezara, któregonazwapochodziodgościa,którynazywałsięJuliuszCezar. Zaczynasięodnarysowanialiterwkole,jakponiżej: Abyuzyskaćzaszyfrowanąliterę,musiszposiadaćtajnyklucz.Wnaszym przykładzieużyjmycyfry3.Abyzakodowaćliterę“a”poprostu przesuwasz3literyzgodniezkierunkiemwskazówekzegara,codaje literę“d”: 2 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Abyodszyfrowaćwiadomośćtrzebakażdąliteręprzesunąćzpowrotemo 3miejsca,wprzeciwnymkierunku. Listazadań Zacznijmyodnapisaniaprogramudoszyfrowanialiter. Uruchomponiższyprogramisprawdźczydziała,gdy wpiszeszliterę“a”: #listaliterdoszyfrowania alfabet="abcdefghijklmnopqrstuvwxyz" #tajnykluczto3 klucz=3 litera=input("Wprowadzliteredozaszyfrowania:") #znajdzpozycjeliterywalfabecie #naprzyklad"a"jestnapozycji0, #"e"jestnapozycji4,itd. pozycja=alfabet.find(litera) #dodajtajnyklucz,abyotrzymacpozycje 3 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. #zaszyfrowanejlitery #%26oznacza"wrocdo0kiedyosiagniesz26" nowaPozycja=(pozycja+klucz)%26 #zaszyfrowanaliteraznajdujesie #napozycjinowaPozycjawalfabecie zaszyfrowanaLitera=alfabet[nowaPozycja] print("Twojaliterapozaszyfrowaniuto"+ zaszyfrowanaLitera) WPythonietekstmożebyćrozumianyjakowiele pojedynczychliterzłączonychrazem(nazywanychtablicą znaków) pozycja=alfabet.find(litera) znajdujepozycjęznakuw alfabecie .Wwiększości językówprogramowaniapozycjezawszezaczynająsięod 0anieod1,więcwtekście “abcdefghijklmnopqrstuvwxyz”,“a”jestnapozycji0,“b” jestnapozycji1itakdalej. 4 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Następnietajnykluczjestdodanydo pozycji ,przezco otrzymujemy nowaPozycje zaszyfrowanejlitery.W naszymprzykładzie,“a”jestnapozycji0,więcpododaniu tajnegokluczamamy 0+3=3 . Kod %26 oznacza,żepodczasszukanianumerupozycji zaszyfrowanejlitery,numerjestcofanydo0jeśliosiągnie wartość26.Tooznaczażelitera“z”wnaszymkodziejest takjakbynapozycjiprzyliterze“a”. Następnie,używamyobliczonegonumerunowejpozycji doznalezieniazakodowanejliteryw alfabecie i wyświetleniajejnaekranie. alfabet[nowaPozycja] wyszukujeliteręnadanejpozycji,dlatego alfabet[0] to “a”, alfabet[3] to“d”. Zauważteż,żewprogramieskorzystaliśmyzkrótszej wersjiwczytywaniakomendużytkownika.Zamiast napisać: print("Wprowadzliteredozaszyfrowania:") litera=input() możeszużyćjednejlinii: litera=input("Wprowadzliteredozaszyfrowania:") 5 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Możeszużyćtegosamegoprogramudoodszyfrowania literyprzezużycieklucza -3 zamiast 3 .Toznaczy,że abyodszyfrowaćliterę,poruszaszsięwodwrotnym kierunkupoalfabecie,wracającdo“z”po“a”. Jeśliwoliszmiećosobneprogramydoszyfrowaniai odszyfrowania,poprostuzamieńkodpowyżejtak,aby poruszałsięwsteczpoalfabecie: #odejmijwartosckluczaabysiecofnac nowaPozycja=(pozycja-klucz)%26 ZapiszSwójProjekt Wyzwanie:Zmienneklucze Zmodyfikujswójprogramszyfrującytak,żebyużytkownik mógłwprowadzićswojąwartośćklucza.Wczytajdane wpisywaneprzezużytkownikaizapisaćjedozmiennej klucz .Pamiętajoużyciufunkcji int() dozamiany wczytanychdanychnaliczbę. 6 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. ZapiszSwójProjekt Wyzwanie:Zaszyfrujiodszyfrujlitery Użyjswojegoprogramudozaszyfrowania: Litery“d”,korzystajączklucza7; Litery“x”,korzystajączklucza4; Czyzpomocątwojegoprogramumożesz odszyfrowaćtąwiadomość: oqlmd(tajnykluczwynosi12) ZapiszSwójProjekt Krok2:Szyfrowaniewiadomości Zamiastszyfrowaćiodszyfrowywaćwiadomościliterapoliterze, napiszmyprogramktórybędziesamszyfrowałiodszyfrowywałcałe wiadomości! ListaZadań Dotejporykorzystaliśmyzpętlidowykonaniakodu: określonąliczbęrazy, domomentuażcośsięstaniewprogramie. Jestjeszczejednametodakorzystaniazpętlipolegająca napowtarzaniuwykonaniakodudlakażdegoelementuw zbiorzedanych.Naprzykład,jeślichceszwyświetlićkażdą literęwczyimśimieniupoprzezwyświetleniekażdejz literpokolei: imie=input("Jakmasznaimie?") #wyświetlkażdąliteręimieniapokolei 7 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. forliterainimie: print(litera) Wpowyższymprogramie,każdaliteraimieniajest kolejnozapisywanadozmiennej litera iwyświetlana. litera jestzwyczajnązmienną,więcmożeszzmienićjej nazwęjeślichcesz.Uruchompowyższyprogramisprawdź jakdziała. Możeszużyćtegotypupętlidozaszyfrowaniacałej wiadomościiodszyfrowaniajejliterapoliterze: #listaliterdoszyfrowania alfabet="abcdefghijklmnopqrstuvwxyz" #wczytajwiadomoscuzytkownika wiadomosc=input("Proszewprowadzicwiadomoscdo zaszyfrowania:").lower() #tazmiennabedziezawieraczaszyfrowana #wiadomosc zaszyfrowanaWiadomosc="" #wczytajklucz klucz=input("Podajklucz:") #taakcjajestpotrzebnaabymiecpewnosc #zeprogramwczytalkluczjakoliczbe klucz=int(klucz) 8 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. #wykonajpetlenakazdejliterzewwiadomosci forliterainwiadomosc: ifliterainalfabet: #znajdzpozycjeliterywalfabecie #naprzyklad"a"jestnapozycji0, #"e"jestnapozycji4,itd. pozycja=alfabet.find(litera) #dodajtajnykluczabyotrzymacpozycje #zaszyfrowanejlitery #%26oznacza"wrocdo0kiedyosiagniesz26" nowaPozycja=(pozycja+klucz)%26 #dolaczzaszyfrowanaliteredowiadomosci #zaszyfrowanaliteraznajdujesie #napozycjinowaPozycjawalfabecie zaszyfrowanaWiadomosc=zaszyfrowanaWiadomosc+ alfabet[nowaPozycja] else: #niektorelitery(np.'£','?')niesa #uwzglednionewalfabecie,dlategopoprostu #dodajjewniezaszyfrowanejformie zaszyfrowanaWiadomosc=zaszyfrowanaWiadomosc+ litera print("Twojazaszyfrowanawiadomosc:", zaszyfrowanaWiadomosc) 9 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Wtymprogramiekażdaliterawwiadomościjest szyfrowanapokoleiidołączanadozmiennej zaszyfrowanaWiadomosc .Nakońcuprogramuwyświetlana jestcaławiadomość. Istniejąlitery,któremogąbyćwprowadzoneprzez użytkownika,aktórenieznajdująsięwnaszym alfabecie .Naprzykład:spacje,przecinki,znakizapytania jakipolskieznakitakiejakąię.Wyrażenie ifliterain alfabet oznaczażetylkolitery,którepojawiająsięw alfabecie sąszyfrowane.Inneznakisąpoprostu dołączane,bezszyfrowania. ZapiszSwójProjekt Wyzwanie:Szyfrowanieiodszyfrowanie wiadomości Zaszyfrujpewnewiadomościiprzekażje koledze/koleżancerazemztajnymkluczem.Sprawdźczy mogąjeodszyfrowaćichprogramem. ZapiszSwójProjekt 10 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Wyzwanie:Ulepszenieszyfru Czydasięodszyfrowaćtwojąwiadomośćbezklucza?Czy możeszzmienićswójprogramtak,abybyłotrudniej złamaćtwójszyfriodczytaćwiadomość?Otokilka pomysłów: Poprzestawiajliterywzmiennej alfabet ; Dodaj1doklucza,zakażdymrazemkiedyliterajest szyfrowana; Usuńspacjeiznakizpozaalfabetuzszyfrowanej wiadomości. ZapiszSwójProjekt 11 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. Wyzwanie:Kalkulatormiłości Napiszprogram,którypokazujejakzgodnesą2osoby przezobliczenieilościpunktówzgodności. Programmożeanalizowaćkolejneliteryz2imioniza każdymrazemkiedyprogramznajdziepewnelitery dodawaćpunktydozmiennej punkty .Możeszsam zdecydowaćnajakichzasadachbędąliczonepunkty.Na przykład,możeszdodawaćpunktyzasamogłoski,alboza literywystępującewsłowie“kocha”: ifliterain"aeiou": punkty=punkty+5 ifliterain"kocha": punkty=punkty+10 Możeszdodaćwyświetlaniewiadomości,wzależnościod osiągniętegowyniku: ifpunkty<10: print("Zapomnij!") ZapiszSwójProjekt 12 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub. 13 ©RaspberryPiFoundation.UKRegisteredCharity1129409.TheseprojectsareforuseoutsidetheUKonly.Moreinformationatwww.codeclubworld.org. ThiscourseworkisdevelopedonGitHub,atwww.github.com/CodeClub.