Övning 6 - Tillämpad datalogi 2012

Relevanta dokument
Övning 6. Komprimering, kryptering, dokumentering & testning

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Tildatenta Lösningsskiss

MA2047 Algebra och diskret matematik

Optimala koder. Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or.

Optimala koder. Övre gräns för optimala koder. Gränser. Övre gräns för optimala koder, forts.

Föreläsning 17 - Komprimering

NÅGOT OM KRYPTERING. Kapitel 1

Källkodning. Egenskaper hos koder. Några exempel

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

DD1320 Tillämpad datalogi. Lösnings-skiss till tentamen

Föreläsning 9 Innehåll

Tentamen, Algoritmer och datastrukturer

Träd och koder. Anders Björner KTH

Programmeringsuppgifter 1

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Övning 3 - Tillämpad datalogi 2012

Grundläggande kryptering & chiffer

Skurlängdskodning. aaaabbbbbbbccbbbbaaaa. Man beskriver alltså sekvensen med ett annat alfabet än det ursprungliga.

Efternamn förnamn pnr programkod

Offentlig kryptering

RSA-kryptering och primalitetstest

Primtal, faktorisering och RSA

Burrows-Wheelers transform

Några satser ur talteorin

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

Krypteringteknologier. Sidorna ( ) i boken

HI1024 Programmering, grundkurs TEN

Kryptering. Krypteringsmetoder

Byggmästarkrypto lärarsida

Kryptering & Chiffer Del 2

Övning 7 - Tillämpad datalogi DD1320, TENTAMEN I TILLÄMPAD DATALOGI Tisdagen den 12 januari 2010 kl 14 18

Nämnarens kryptoskola fördjupning. Enkel transposition

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Krypteringsprogrammet Kryptogamen

Fredag 10 juni 2016 kl 8 12

Grundfrågor för kryptosystem

Innehåll. Föreläsning 11. Organisation av Trie. Trie Ytterligare en variant av träd. Vi har tidigare sett: Informell specifikation

Uppgift 1 ( Betyg 3 uppgift )

Datalogi för E Övning 3

Objektorienterad Programkonstruktion. Föreläsning 16 8 feb 2016

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDI16: Datastrukturer och algoritmer

x 23 + y 160 = 1, 2 23 = ,

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Ordbokskodning. Enkel variant av kodning med variabelt antal insymboler och fixlängds kodord. (Jfr tunstallkodning)

Exempel, minnesfri binär källa. Ordbokskodning. Lempel-Zivkodning. Lempel-Zivkodning, forts.

Tentamen i Algoritmer & Datastrukturer i Java

Programmeringsolympiaden 2010 Kvalificering

MMA132: Laboration 2 Matriser i MATLAB

Grundläggande krypto och kryptering

RSA-kryptografi för gymnasiet. Jonas Gustafsson & Isac Olofsson

Algoritmer, datastrukturer och komplexitet

Grundläggande datalogi - Övning 9

Utdrag från Verklighetens Kvadratrötter: Sida 1 en bok om matematikens användningsområden skriven av Marcus Näslund. Mer info:

TDDI16: Datastrukturer och algoritmer

Kryptering. Av: Johan Westerlund Kurs: Utveckling av webbapplicationer Termin: VT2015 Lärare: Per Sahlin

C++ Lektion Tecken och teckenfält

Grupper och RSA-kryptering

Metoder för sekretess, integritet och autenticering

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

Föreläsning 4 Datastrukturer (DAT037)

ENKEL Programmering 3

Algoritmer, datastrukturer och komplexitet

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Föreläsning 7. Felrättande koder

Övning 1 - Abstrakta datatyper

18 juni 2007, 240 minuter Inga hjälpmedel, förutom skrivmateriel. Betygsgränser: 15p. för Godkänd, 24p. för Väl Godkänd (av maximalt 36p.

1. (3p) Ett RSA-krypto har parametrarna n = 77 och e = 37. Dekryptera meddelandet 3, dvs bestäm D(3). 60 = = =

Magnus Nielsen, IDA, Linköpings universitet

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Algebra och Diskret Matematik A (svenska)

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Tentamen TEN1 HI

Protokollbeskrivning av OKI

Datastrukturer och algoritmer. Innehåll. Trie. Informell specifikation. Organisation av Trie. Föreläsning 13 Trie och Sökträd.

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Lösningsförslag till tentamensskrivning i SF1610 Diskret Matematik för CINTE 30 maj 2018, kl

Linköpings Tekniska Högskola Instutitionen för Datavetenskap (IDA) Torbjörn Jonsson, Erik Nilsson Lab 2: Underprogram

Kryptoteknik. Marcus Bendtsen Institutionen för Datavetenskap (IDA) Avdelningen för Databas- och Informationsteknik (ADIT)

kl Tentaupplägg

MATEMATIK I SÄKERHETENS TJÄNST OM KODNING OCH KRYPTERING 1

DD1314 Programmeringsteknik

Laboration 3, uppgift En klass för en räknare

Algoritmer, datastrukturer och komplexitet

DN1212/numpm Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

UPPGIFT 1 TVÅPOTENSER. UPPGIFT 2 HISSEN I LUSTIGA HUSET.

Tentamen TEN1 HI

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Tentamen i Grundläggande Programvaruutveckling, TDA548

DN1212/numpp Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

TDP Regler

Föreläsning 4 Datastrukturer (DAT037)

Tenta i Grundläggande programmering DD klockan

Facit Tentamen TDDC (7)

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

SLU Säkerhets instruktioner avseende kryptering av filer

Transkript:

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20121 0 # coding : latin Övning 6 - Tillämpad datalogi 2012 Sammanfattning Idag gick vi igenom komprimering, kryptering och testning. Specifikt löste vi komprimeringproblem med huffmankodning och Lempel-Ziv, funderade på testproblem till lab 5, samt krypteringsproblem rot13, transpositionschiffer och RSA. Some imports, ignore 20 import s y s, o s 21 s y s. p a t h. append ( o s. getcwd ()) Komprimering, kryptering och testning. 1. Smittskydd Du har fått ett mail som innehåller tips mot spridning av virus. Informationen är komprimerad med ett Huffmanträd där nollor motsvarar vänster och ettor motsvarar höger (se figur, "T" kodas t.ex. som 11) Vad står det i meddelandet 010101011000110011001111? 00 01 10 T 01 D V H N Ä A 000 001 010 011 1001 0101 011 001 001 101 11 H A N D T V Ä T T Om Huffmankodning (från föreläsning 11) Om vi vet hur vanliga olika tecken är i texten kan vi ställa upp en tabell där vi för varje tecken kan ange sannolikheten för att ett visst tecken ska dyka upp. I David A. Huffmans metod kodar man varje tecken med ett binärt tal, där vanligare tecken får kortare koder. Algoritmen som beräknar vilket tecken som ska få vilken binär kod går ut på att man ritar upp ett binärt träd, där varje tecken ses som ett löv. Sedan numrerar man t rädets grenar med 0 och 1 och följer trädet från roten ut till varje löv för att se koderna. 1. Sortera tecknen som ska kodas i stigande sannolikhetsordning.

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20122 2. Rita grenar från de två tecken som har lägst sannolikhet och låtsas att vi har ett nytt tecken med sannolikhet som är summan av deras sannolikheter. Numrera ena grenen med 0 och andra med 1. 3. Upprepa punkt 2 tills alla tecken kommit med. Roten bör få sannolikhet 1. 4. Börja från roten och följ grenarna ut till ett löv. Samla nollor och ettor på vägen - dessa ger koden för lövets tecken Med följande frekvenstabell Tecken Sannolikhet G 0.05 R 0.05! 0.1 A 0.15 H 0.2 I 0.3 Får vi följande Huffmanträd, där vi skapade i ordning 1-6: Root p=1 6 0 p=0.4 4 5 1 p=0.6 00 p=0.2 H 01 p=0.2 01 p=0.3 I 001 p=0.3 2 3 000 p=0.1! 001 p=0.1. 010 p=0.15 A011 p=0.15 1 G0000 R0001 p=0.05 p=0.05

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20123 2. Huffman för Havamal "man är mans gamman" kan man läsa i Havamal. Konstruera en huffman- kod för tecknen i detta uttryck (rita trädet) och skriv sedan upp det i kodad form. Vi börjar med att räkna ut sannolikheten för varje bokstav i utrrycketvi utifrån att dess frekvensen dela på total och sorterar i stigande ordning. antal bokstäver. Bokstav g s r ä blanksteg n a m Frekvens 1 1 1 1 3 3 4 4 Sannolikhet 1/18 1/18 1/18 1/18 3/18 3/18 4/18 4/18 1 Börjar med g och s som är bland de med lägst frekvens 2 Sen med r och ä som som nu har lägst 3 sannolikehet Sen slår vi ihol träd 1 och 2 som nu har lägst sannolikhet p=4/18 g 0 s1 r 0 ä1 4 Nu slår vi ihop blanksteg och n som har lägst sannolikhet p=6/18 5 Nu är det tre som har samma sannolikhet så kan vi välja. Antingen a+m, a+träd 3 eller m+träd 3. Vi väljer a+m. p=8/18 g00 s01 r 10 ä11 blanksteg0 n1 p=3/18 p=3/18 a0 m1 p=4/18 p=4/18 6 Nu slår vi ihop träd 3 och 4 p=10/18 7 Tillslut slår vi ihop träd 5 och 6 och har är då färdiga. Root p=1 p=4/18 p=6/18 p=10/18 p=8/18 00 01 blanksteg10 n11 p=3/18 p=3/18 00 01 p=4/18 p=6/18 a10 m11 p=4/18 p=4/18 g000 s001 r010 ä011 000 001 blanksteg010 n011 p=3/18 p=3/18 g0000 s0001 r0010 ä0011 p=1/1 p=1/18 Vi får följande Huffmankod (OBS Huffmankoden hade sett lite annorlunda ut om vi valt en annan kombo i steg 5. Dock hade den varit lika optimal): Bokstav g s r ä blanksteg n a m Huffmankod 0000 0001 0010 0011 010 011 11 Koden för "man är mans gamman" blir: 01 11 011 010 0011 0011 010 01 11 011 0010 010 0001 11 01 011 m a n _ ä r _ m a n s _ g a m m a n Totalt blir meddelandet 50 bit långt. 01110110001101010011 10110010 01000001 01111011 8 8 8 8 8 8 2 =50 bits

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20124 3. Enkel kryptering Kryptera lösenordet SIMSALABIM med 1. rot13 2. Transpositionschiffer 1) Med rot13 skiffer förskjuter vi varje bokstav 13 steg, så a blir n, b blir o,..., z blir m. Vi kan skriva följande kodtabell: 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 N O P Q R S T U V W X Y Z A B C D E F G H I J K L M Vi får då koden FVZFNYNOVZ 2) För att skapa ett transpositionschiffer ska vi skriva meddelandet i n x m matris och sen bilda meddelandet utifrån kolumnerna. Meddelandet är 10 långt. Låt oss sätta n=3 och m=4. Matrisen blir då: S I M S A L A B I M och vi får meddelandet SAIILMMASB från kolumnerna (andra varianter är också möjliga med andra värden på n och m) 4. Testning I labb 6 ska ni göra ett program som kontrollerar syntaxen för en molekylfor- mel. Skriv upp en samling indata att testa programmet med! Giltiga formler Ogiltiga formler Tomma strängen? både en- och tvåteckens siffror Tänk på att ej korrekta kemiska formler är tillåtna.

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20125 5. RSA-kryptering (ur kursboken, uppg 2 s. 125) Du vill hålla ditt turnummer (18) hemligt, och har därför bestämt dig för att kryptera det med RSA. Välj två primtal större än 500 och använd dom för att kryptera turnumret. RSA (från Ron Rivest, Adi Shamir och Leonard Adleman som först publiceraden) kräver att vi skapar en offentlig nyckel och en privat nyckel. Den offenliga nyckeln delas ut till alla som ska kunna skicka kryptera meddelanden. medans den privata nyckeln ges till den som ska kunna dekruptera meddelandena. e och d beräknas på fäljande sätt: Välj två stora primtal, p och q. Beräkna n = p*q. Beräkna f = (p-1)*(q-1). Välj e så att det inte har några gemensamma faktorer med f (dvs gcd(e,f) ska bli 1). Beräkna d som den multiplikativa inversen till e modulo f, dvs så att e*d modulo f = 1. För att kryptera ett meddelande konverteras det till ett tal (t.ex. konkatenera ASCII-koderna). som sedan delas upp i lagom stora delar m i. Delarna krypteras sen genom att ta m e i modulo n vilket resulterar i de kodade delarna c i. För att dekryptera meddelandet tar vi c d i modulo n. Kryptering: Vi börjar med att bräkna e } p = 587 = p * q = 422053 q = 719 f(n) = (p 1) * (q 1) = 420748 = 2 * 2 * 293 * 359 e = 17 väljs så att 1 < e < f, och e och f är relativa primtal, dvs de har inga faktorer gemensamma, eller gcd(e, f) = 1. Nu är vi egentligen klara med uppgiften. Krypteringen blir: 18 17 modulus 422053 = 161344 Dekryptering: Om vi nu även vill dekryptera meddelandet behöver vi skapa nyckeln d d = 222749 så att d*e 1mod(f(n)), dvs d*17 1mod(420748) sp, även går att skriva som d*17 = 1+n*420748. Detta är en ekvation med två obekanta. Vi vill hitta det n för vilken d är ett heltal. Med lite testande finner vi att n=9 ger den minsta heltalslösningen d = 222749. Dekrypteringen blir: 161344 222749 modlus 422053 = 18

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20126 6. Lempel-Ziv I denna uppgift ska du avkoda ett meddelande som komprimerats med Lempel-Zivs metod. Komprimeringen går till så att komprimeraren lagrar en lista med strängar som från början enbart innehåller tomma strängen. Komprimeraren läser tecken för tecken från intexten den längsta sträng som ligger i strängtabellen. Sedan skrivs index för denna sträng i tabellen ut, följt av nästa tecken i intexten. Strängtabellen utökas med strängen plus nästa tecken. Därefter läses åter tecken för tecken från intexten. Så fort en sträng inte finns i strängtabellen läggs den alltså till. Metoden kan i (icke-optimerad) kod beskrivas så här: 281 def l z w ( t e x t ) : 282 t a b l e = T a b l e () 283 q=queue () 284 f o r c i n t e x t : # spara texten tecken för tecken i en kö 285 286 q. put ( c ) 287 s=" " 288 t a b l e. add ( s ) 289 k o d t e x t=" " # här sparas den kodade texten 290 291 w h i l e not q. i s e m p t y () : 292 c=q. g e t () 293 i f t a b l e. e x i s t s ( s + c ) : 294 s=s + c 295 e l s e : 296 k o d t e x t +=s t r ( t a b l e. code ( s ))+ c 297 t a b l e. add ( s + c ) 298 s=" " 299 i f not s==" " : 300 k o d t e x t +=s t r ( t a b l e. code ( s )) 301 r e t u r n k o d t e x t, t a b l e Klassen Table stöder inläggning av strängar, kontroll av om en sträng finns i tabellen och möjlighet att ta reda på index hos en speciell sträng. Index bestäms av ordningen strängarna lades in i, där den första strängen har index 1. Uppgiften är att avkoda följande text, där alfabetet består av versaler och mellanslag kodat som _. 1S1T1O1R2T4C1K1H4L1M2 _ 6O1L3A1 _ 9O14M1A5 Det vill säga: textitvad är t om print lzw(t) ger ovanstående som utskrift? Ge också en tabell med strängar och index som motsvarar tabellen i koden! Algoritm Lempel-Zivs algoritmen ovan i ord: 0) Vi börjar med s="". 1) Ifall s+c existerar gör vi inget med tabellen och låter istället s bir s+c och kollar igenom 2) Om s+c inte finns i tabellen lägger vi till det i tabellen, nollställer s, (s="") samt ökar på kodtext med kod för s plus c. 3) Gå till 1 och ta ut ett nytt tecken ur c kön tills kön är slut. 4) Om inte s är tom lägg till koden för s.

/home/lindahlm/activity-phd/teaching/12dd1320/exercise6/exercise6.py October 2, 20127 Avkodning För att avkoda ett meddelande bygger vi upp tabellen utifrån meddelandet på följande sätt: index:1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 "" 1S1T1O1R2T4C1K1H4L1M2_6O1L3A1_9O14M1A5 S T O R ST OC K H OL M S_ STO L TA _ HO LM A R Den resulterande tabellen blir då: index 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 code "" S T O R ST OC K H OL M S _ STO L TA _ HO LM A Med lzw får vi: 325 from m y _ u t i l s import Table, Queue 326 327 t e x t="storstockholms STOLTA HOLMAR" 328 k o d t e x t, t a b l e = l z w ( t e x t ) 329 p r i n t t a b l e { : 1, M : 11, OL : 10, : 16, H : 9, K : 8, STO : 13, OC : 7, L : 14, O : 4, ST : 6, HO : 17, S : 2, R : 5, A : 19, T : 3, S : 12, LM : 18, TA : 15} 330 p r i n t k o d t e x t 1S1T1O1R2T4C1K1H4L1M2 6O1L3A1 9O14M1A5