Obligatorisk oppgave 6 i INF1010: Dekryptering INF1010 Frist: mandag 8. mai 2017 kl. 12:00 Versjon 1.0 (8cb4fee ) Innhold 1 Innledning 1 2 Modell 2 3 Pakke for lytting på kanaler og dekryptering 2 4 Implementasjon 3 4.1 Antall telegrafister og kryptografer................. 3 4.2 Ekstra informasjon i meldingene.................. 3 4.3 Operasjonslederen.......................... 4 4.4 Monitorer............................... 4 4.5 Avslutning av trådene........................ 4 5 Løsning 4 1 Innledning I denne oppgaven skal du lage et program som med tråder som virker som produsenter og konsumenter. For å gjøre dette litt mer konkret, kan vi tenke oss at vi simulerer en etterretningssentral fra 1900-tallet som overvåker linjer hvor det sendes krypterte meldinger. Du skal bruke tråder og monitorer for å simulere forskjellige arbeidere.
2 Modell Etterretningssentralen har tre typer arbeidere, telegrafister, kryptografer og operasjonslederen. I programmet skal disse modelleres med hver sin klasse som vi kan opprette tråder av. Dette er et såkalt produsent/konsument-problem. Telegrafistene avlytter hver sin kanal og mottar meldinger. Disse meldingene må gis videre til kryptografene, som kan dekryptere dem. Telegrafisten blir således produsenten, som leverer fra seg meldingene til en monitor (vi kan tenke oss at denne er et bord), og kryptografen blir konsumenten, som henter meldinger fra monitoren. I tillegg skal kryptografene levere fra seg meldingene til en annen monitor slik at de samles der og kan hentes ut av en operasjonsleder. Her blir altså kryptografene produsentene og operasjonslederen konsumenten. Telegrafist 1 Kryptograf 1 Operasjonsleder Telegrafist 2 Monitor for krypterte meldinger Kryptograf 2 Kryptograf 3 Monitor for dekrypterte meldinger Telegrafist 3 Kryptograf 4 Figur 1: Flyten av meldinger i programmet. De røde og grønne pilene representerer henholdsvis overføringer av krypterte og dekrypterte meldinger. De røde boksene representerer tråd-objekter, og de blå boksene representerer monitor-objekter. NB: Dette er ikke en datastrukturtegning! 3 Pakke for lytting på kanaler og dekryptering For å lytte på kanaler, samt dekryptere meldinger, skal du benytte metoder som er gitt i en pakke som ligger på http://folk.uio.no/inf1010/v17/oblig/6/ lib. Les README-filen og dokumentasjonen for en beskrivelse av API-et og instruksjoner til hvordan du bruker denne pakken. Tiden det går mellom to meldinger på en kanal vil variere fra kjøring til kjøring. Det kan derfor hende at meldingene blir lagt inn i monitoren i forskjellig rekkefølge fra gang til gang. 2
Meldingene blir kryptert ved at tegnene i meldingen stokkes om. De spesielt interesserte kan lese om hvordan dette virker her. Tiden det tar å dekryptere en melding er proporsjonal med meldingens lengde. Det vil si at en melding på 200 tegn vil ta dobbelt så lang tid å dekryptere som en melding på 100 tegn. Dekrypteringsalgoritmen vil gå veldig fort på en moderne datamaskin, så derfor har vi lagt inn kunstig venting slik at programmet ikke fullføres umiddelbart. Dette gjøres ved kall på sleep() på den kjørende tråden. Merk at sovende tråder ikke vil bruke prosessortid, og dermed kan du kjøre flere tråder enn du har logiske prosessorer for å få programmet til å gå raskere. Dersom trådene utførte faktisk arbeid hele tiden, ville ikke programmet gått fortere hvis vi økte antall tråder utover antall logiske prosessorer. Dette er fordi hver logiske prosessor kun kan kjøre én tråd om gangen. 4 Implementasjon 4.1 Antall telegrafister og kryptografer Programmet skal være så generelt at antall kryptografer skal kunne settes til et vilkårlig positivt tall. Det samme gjelder antall telegrafister, men det skal ikke være flere telegrafister enn kanaler. (Hver telegrafist har sin egen kanal). Se dokumentasjonen for API-et for hvordan dette skal håndteres. 4.2 Ekstra informasjon i meldingene Dekrypteringsmetoden i API-et opererer på String-objekter, men du trenger også å lagre noe ekstra informasjon i hver melding. I tillegg til String-objektet som utgjør innholdet i meldingen, må hver melding ha et sekvensnummer og ID-en til kanalen meldingen kom fra. Denne informasjonen er nødvendig for å kunne skille meldingene etter kanal og sortere dem i riktig rekkefølge slik at meldingene fra hver kanal kan skrives ut sammen. Merk at kryptografene ikke trenger å ta hensyn til sekvensnummer eller kanal-id når de henter ut meldingene. Du bør bruke en passende beholder fra oblig 3 slik at ingen meldinger blir liggende for lenge i monitoren før de blir hentet av en kryptograf. (Det er også greit å bruke ArrayList eller LinkedList hvis du heller vil det.) 3
4.3 Operasjonslederen Når alle telegrafistene og kryptografene er ferdige, skal operasjonslederen skrive meldingene til fil, med én fil for hver kanal. Hver melding skal være adskilt av to linjeskift. Pass på at meldingene kommer i riktig rekkefølge! 4.4 Monitorer Husk at du bør unngå å utføre mye arbeid (og dermed bruke mye tid) i monitorene. Når en tråd har fått tilgang til en monitor, må alle de andre trådene vente. Utfordring. Klarer du å bruke samme klasse for begge monitor-objektene? 4.5 Avslutning av trådene Før main-tråden avslutter, skal alle de andre trådene være ferdige. For å få til dette, må du sørge for at produsentene på en eller annen måte signaliserer til monitoren at den ikke kommer til å produsere noe mer. Hvis monitoren ikke lenger har noen aktive produsenter, skal konsumentene avslutte når monitoren er tom. OBS. Husk at monitoren kan være tom uten at produsentene er ferdige. Da må konsumentene vente (ikke avslutte). 5 Løsning Det kan være lurt å løse denne oppgaven etappevis. 1. Telegrafist (lytting) 2. Telegrafist (levere kryptert melding) og Kryptograf (hente og dekryptere melding) 3. Kryptograf (levere dekryptert melding) og Operasjonsleder (hente og organisere dekrypterte meldinger) 4
Merk. Meldingene du mottar er kodet i UTF-8, så bruk UTF-8 når du skriver meldingene til fil. Du kan gjøre som følger for å opprette en PrintWriter som skriver til File utfil med UTF-8-koding: new PrintWriter(utfil, "utf-8"); Du vil se om programmet ditt virker som det skal ved at tekstene som skrives til fil er leselige og rekkefølgen på avsnittene virker rimelig. Du bør også sjekke at meldingene er ordnet med sekvensnumrene i stigende rekkefølge. Hvis du synes programmet går sakte, kan du øke antallet kryptografer. Med 3 telegrafister og 5 kryptografer tar det ca. 40 sekunder. Med 20 kryptografer tar det ca. 15 sekunder. Lykke til! Stein Gjessing og Kristian 5