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.

Podobne dokumenty