INF100/INF100-F - INNLEVERING 2 HØSTEN 2005 Krav til innlevering For at innleveringen skal godkjennes må følgende leveres: Oversikt Et dokument som inneholder en oversikt over innleveringen. Den skal inneholde en kort beskrivelse av alle filene som blir levert inn og skal også oppgi navn, gruppenummer og epost-adresse. Hvis du ikke går på noen gruppe, skal du skrive ingen gruppe. Kildekode All kildekode skal selvsagt legges ved. Kildekoden skal være godt kommentert slik at det er lett å sette seg inn i programmenes virkemåte. Koden skal også være godt indentert (dvs. ha innrykk der programmet tilsier det) og lett å lese (f.eks. fornuftig bruk av variabelnavn). Kjøreeksempel For hvert program skal det være med en fil som inneholder en logg av en typisk kjøring av programmet. Et slikt kjøreeksempel viser hvordan programmet brukes og hva programmet skriver ut. Under Linux kan filer med kjørelogg lages slik: 1. Kjør kommandoen: script logg.txt 2. Kjør programmet ditt fra kommandolinjen v.h.a. kommandoen: java Mittprogram 3. Avslutt med kommandoen exit All skjermutskrift som ble produsert mens skriptet ble kjørt ligger nå på filen logg.txt. Alle filene som skal leveres pakkes i en egen zip-fil med navn som er sammensatt av fornavnet ditt og gruppen din. Dette gjøres slik: Hvis du f.eks. har fornavn Yngve og går på Gruppe 3, og du vil ha filene Oppgave1.java, Oppgave2.java, oversikt.txt, logg1.txt og logg2.txt med i din innlevering, lager du en zip-fil med navn yngve3.zip med kommandoen (alt på en linje): zip yngve3 Oppgave1.java Oppgave2.java oversikt.txt logg1.txt logg2.txt Du skal ikke levere inn filene som inneholder bytekode (filene med navn *.class). Bruk 0 som gruppenummer hvis du ikke går på noen gruppe. Innleveringen leveres på følgende nettside: http://nettkurs.uib.no/cms_struts/upload.do. Under Oppgaver på kurset sine sider i Studentprotalen finnes det et pdf dokument med informasjon om hvordan innleveringsystemet brukes. Innleveringsvilkår Innleveringsfristen for Oppgave 1 er mandag 31. oktober 2005, Kl 16:00, og for Oppgave 2 er fristen mandag 7. november 2005, Kl 16:00. Besvarelsen skal bedømmes av gruppeleder, som setter en poengsum på en skala fra 0 (dårligste karakter) til 25 (beste 1
karakter). Innlevering etter fristen eller ingen innlevering vil resultere i poengsummen 0. Gjennomsnittet av poengsummene på de fire innleveringene i INF100 høsten 2005 teller 20% av sluttkarakteren,og den totale poengsummen må være minst 40 for å få lov til å ta eksamen. Det er tillatt at to studenter (ikke flere) samarbeider om innleveringen og leverer identiske besvarelser. De må da levere hver for seg og oppgi navnet på samarbeidspartneren i oversiktsdokumentet. Oppgave 1 I denne oppgaven skal vi lage et program som krypterer eller dekrypterer en melding. Det vil si at vi erstatter en tekst med en ny tekst som for de fleste vil være uforståelig. Dette skal gjøres ved at hver bokstav eller hvert siffer i teksten erstattes med en annen bokstav eller siffer. Bare de små bokstavene a til z og sifrene 0 til 9 skal erstattes, alle store bokstaver og spesialtegn (som f.eks. æ,, og? ) forblir uendret. Krypteringen baseres på en heltallig nøkkel og en tabell som angir rekkefølgen på tegnene. I denne oppgaven skal vi bruke en tabell som har bokstavene a til z i vanlig alfabetisk rekkefølge, mens sifrene 0 til 9 skal være permutert slik tabellen under viser. [a,b,c,...,z,7,2,4,1,0,9,8,3,5,6] (OBS!: Vær nøye med rekkefølgen på sifrene!) Den heltallige nøkkelen som leses fra bruker kan være både positiv og negativ. Dette tallet angir hvor mange posisjoner ut i tabellen vi finner det tegnet vi skal erstatte hver forekomst av det opprinnelige tegnet i teksten med. Hvis f.eks. nøkkelen er 7, vil hver d erstattes med en k, mens 8 erstattes med d (tenk deg at etter 6 starter tabellen på nytt med a, b, c,...). Under er et forslag til hvordan en skjermutskrift fra programmet kan se ut. Det er én utskrift for kryptering og én for dekryptering. bash-3.00$ java Kryptering1 Dette programmet kan brukes til å kryptere/dekryptere en tekst. Programmet leser inn et tall og en tekst og returnerer en kryptert/dekryptert tekst. Gi krypteringsnøkkel: -6 Gi tekst som skal krypteres eller dekrypteres: Denne knekker du ikke. Den krypterte/dekrypterte teksten er: D5hh5 eh5ee5l 3o cee5. bash-3.00$ java Kryptering1 Dette programmet kan brukes til å kryptere/dekryptere en tekst. Programmet leser inn et tall og en tekst og returnerer en kryptert/dekryptert tekst. 2
Gi krypteringsnøkkel: 42 Gi tekst som skal krypteres eller dekrypteres: D5hh5 eh5ee5l 3o cee5. Den krypterte/dekrypterte teksten er: Denne knekker du ikke. Oppgave 2 Vi skal nå lage et program som krypterer et gitt antall linjer med tekst. For at det skal bli enda vanskeligere for utenforstående å dekryptere teksten, skal vi bruke en mer kompleks funksjon enn den som ble brukt i oppgave 1. Også i denne oppgaven skal vi bruke et heltall som nøkkel, men denne gangen skal dette tallet bare angi startpunktet i en annen funksjon. For å generere tilfeldige tall, bruker datamaskinen en funksjon som tar et tall som innparameter og gir ut et nytt tall. Det nye tallet brukes så som innparameter for å gi tall nummer to. Dette fortsetter til det nødvendige antall tall er generert. Vi skal benytte oss av at den samme sekvensen med tall blir generert hver gang, gitt at starttallet er det samme. Dette starttallet kaller vi et frø. For å gjøre dette enda vanskeligere å dekryptere, skal vi ikke bruke disse tallene direkte. Vi lager én tabell som skal brukes til både kryptering og dekryptering. Tabellen lages på følgende måte: Bruk heltalls nøkkelen som er gitt av bruker som frø. Dette frøet settes med metoden setseed i java.util.random klassen. Deretter lager vi en todimensjonal tabell, med 80 kolonner og én rekke for hver linje tekst vi skal kryptere eller dekryptere. Fyll denne tabellen rekke for rekke med tilfeldige tall fra intervallet [0-25]. Første tall skal i første rekke og første kolonne, andre tall i første rekke og andre kolonne,..., det 81. tallet skal i andre rekke første kolonne osv. Et lite eksempel med 3 kolonner der 4 er brukt som frø er vist i tabellen under. 16 18 13 22 5 15 For å gjøre dette vanskeligere for dem som kjenner funksjonen som genererer tilfeldige tall, fortsetter vi og fyller en ny tabell på samme måte. Det er viktig at frøet ikke blir satt på nytt, for da får vi bare de samme tallene som i den første tabellen. Tabell to fra eksempelet med 3 kolonner og 4 som frø er vist under. 5 22 8 15 4 20 Vi skal nå beregne den endelige tabellen som skal brukes til kryptering/dekryptering. For hver celle i den andre tabellen legger vi til verdien lagret i cellen på samme rekke og kolonne i den første tabellen. Etter summeringen kan verdien i hver celle overstige 25, mens den endelige tabellen bare skal inneholde verdiene [0-25]. Dette kan imidlertid løses ved å bruke modulo operasjonen ( % 26 i java). Vi har nå konstruert Krypteringstabellen som skal brukes til kryptering og dekryptering. (Hvordan kan Krypteringstabellen beregnes uten å bruke to tabeller?). Under er Krypteringstabellen for vårt eksempel med 3 rekker. 3
21 14 21 11 9 9 Tallene fra Krypteringstabellen skal nå brukes til å kryptere eller dekryptere de linjene med tekst som er lest inn. Dette skal gjøres ved at hver bokstav erstattes med en annen bokstav. Bare de små bokstavene a til z skal erstattes, alle store bokstaver og spesialtegn (som f.eks. æ, 9,, og? ) forblir uendret. Første rekke i tabellen skal brukes til å kryptere eller dekryptere den første linjen, andre rekke skal brukes på andre linje, osv. For kryptering, så angir tallet i rekke i kolonne j, hvor mange posisjoner ut i alfabetet fra bokstav nummer j i linje i vi finner bokstaven som vi skal erstatte bokstav nummer j i linje i med. For dekryptering, så angir tallet hvor mange posisjoner tidligere i alfabetet vi finner bokstaven som skal erstatte bokstav nummer j i linje i. F.eks hvis vi krypterer og tallet er 5, så blir d erstattet med en i, mens y blir erstattet med en d (tenk deg at etter z starter alfabetet på nytt med a, b, c,...). For dekryptering blir det motsatt. Er tallet 5, så blir i erstattet med en d, mens d blir erstattet med en y. Siden tabellen bare har 80 kolonner, så vil bare de 80 første tegnene på hver linje bli kryptert. I dette programmet skal vi se bort fra alle tegn som kommer etter tegn nummer 80 på linjen. I denne oppgaven skal det lages et program med følgende egenskaper: Det skal leses inn et tegn for å avgjøre om det skal kryptere eller dekryptere. Tegnet k eller K betyr at programmet skal kryptere og tegnene d eller D betyr at det skal dekryptere. Det skal lese inn et heltall som krypteringsnøkkel. Det skal lese inn et heltall som angir hvor mange linjer som skal krypteres eller dekrypteres, samt at disse linjene med tekst skal leses inn. Krypteringstabellen med 80 kolonner som er beskrevet over, skal lages fra den angitte nøkkelen. Bare én tabell skal brukes til å beregne krypteringstabellen. Krypteringstabellen skal brukes som beskrevet over til å kryptere eller dekryptere den innleste teksten. Under er et eksempel på hvordan dialogen med brukeren av programmet kan være når et sett med linjer skal krypteres og dekrypteres. bash-3.00$ java Kryptering2 Dette programmet krypterer eller dekrypterer et gitt antall linjer tekst. Programmet leser inn følgende: - Tegnet k for kryptering eller d for dekryptering. - Et heltall som brukes som krypteringsnøkkel. - Et heltall som angir antall linjer som skal krypteres. - Det antallet linjer tekst som er angitt. Programmet returnerer så en kryptert eller dekryptert versjon av teksten. Svar k for kryptering og d for dekryptering: k 4
Gi krypteringsnøkkel: 53 Gi antall linjer som skal krypteres: 4 Gi linje 1 som skal krypteres: Der bode en underlig gråsprængt en Gi linje 2 som skal krypteres: på den yderste nøgne ø; - Gi linje 3 som skal krypteres: han gjorde visst intet menneske mén Gi linje 4 som skal krypteres: hverken på land eller sjø; Den krypterte teksten blir: Dgp qrzw cl klcclcpk cxåhrræzlu cc tå fij oyegzja zøozj ø; - ahp zmmodb tvxkn hbbsq wlrkgnsa réi fhdzkru cå gzdf kfcys frø; bash-3.00$ java Kryptering2 Dette programmet krypterer eller dekrypterer et gitt antall linjer tekst. Programmet leser inn følgende: - Tegnet k for kryptering eller d for dekryptering. - Et heltall som brukes som krypteringsnøkkel. - Et heltall som angir antall linjer som skal krypteres. - Det antallet linjer tekst som er angitt. Programmet returnerer så en kryptert eller dekryptert versjon av teksten. Svar k for kryptering og d for dekryptering: d Gi krypteringsnøkkel: 53 Gi antall linjer som skal krypteres: 4 Gi linje 1 som skal dekrypteres: Dgp qrzw cl klcclcpk cxåhrræzlu cc Gi linje 2 som skal dekrypteres: tå fij oyegzja zøozj ø; - Gi linje 3 som skal dekrypteres: ahp zmmodb tvxkn hbbsq wlrkgnsa réi Gi linje 4 som skal dekrypteres: fhdzkru cå gzdf kfcys frø; 5
Den dekrypterte teksten blir: Der bode en underlig gråsprængt en på den yderste nøgne ø; - han gjorde visst intet menneske mén hverken på land eller sjø; 6