Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

Like dokumenter
Steg 1: Regneoperasjoner på en klokke

Legg bort skilpaddene dine, i dag skal vi lære hvordan vi kan sende hemmelige beskjeder!

Steg 1: Rest etter divisjon

Kryptering med vigenere-metoden

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

Steg 1: Husker du skilpadden?

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang

Legg bort skilpaddene dine, i dag skal vi lære hvordan vi kan sende hemmelige beskjeder!

Steg 1: Få noe på skjermen

JS: Grunnleggende JavaScript

Repetisjon Novice Videregående Python PDF

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

Mattespill Nybegynner Python PDF

Legg bort skilpaddene dine, i dag skal vi lære hvordan vi kan sende hemmelige beskjeder!

Hemmelige koder. Kodeklubb-koden. Steg 1: Alfabetet. Sjekkliste. Introduksjon

Kryptering med Vigenère-metoden

PXT: Micro:bit repeater

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

Steg 1: Piler og knappetrykk

MAT1030 Diskret Matematikk

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang. Sjekkliste. Introduksjon

MAT1030 Diskret matematikk

Øvingsforelesning 1 Python (TDT4110)

PXT: Tikkende bombe. Introduksjon. Steg 1: Vi starter spillet. Skrevet av: Kolbjørn Engeland

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

I denne oppgaven skal vi gjøre enkle operasjoner på tekst, som å endre størrelsen på bokstavene og telle ord.

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

PXT: Det regner mat! Introduksjon. Steg 1: Grunnlag. Sjekkliste. Skrevet av: Helene Isnes

MAT1030 Plenumsregning 1

Skilpaddefraktaler Erfaren Python PDF

I denne oppgaven skal vi gi en enkel innføring til klasser og objekter (ordene forklares senere i teksten).

ToPlayer. Introduksjon: Skrevet av: Ruben Gjerstad Eide og Kine Gjerstad Eide

Hver ting i en liste kalles et element. En liste lages ved å skrive elementer inni [], med, mellom elementene:

Bygg et Hus. Introduksjon. Steg 1: Prøv selv først. Skrevet av: Geir Arne Hjelle

Kan micro:biten vår brukes som et termometer? Ja, den har faktisk en temperatursensor!

Finne ut om en løsning er helt riktig og korrigere ved behov

Steg 1: Tekst på flere linjer

Øvingsforelesning i Python (TDT4110)

Skilpadder hele veien ned

Oppgaver uke 1: Løsningsforslag

Steg 1: Vår første datamaskin

Uendelig bakke. Introduksjon. Skrevet av: Kine Gjerstad Eide

Denne oppgaven innfører funksjoner, og viser hvordan vi kan skrive og teste funksjoner i Ellie.

Her skal du lære å programmere micro:biten slik at du kan spille stein, saks, papir med den eller mot den.

Steg 1: Lag bildedeklarasjon

PXT: Spå fremtiden med bilder

Hvor i All Verden? Del 2. Introduksjon. Steg 0: Forrige gang. Skrevet av: Geir Arne Hjelle

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

Steg 0: Installere Pygame Zero

JS: Grunnleggende JavaScript Nybegynner

Tell sekunder. Introduksjon. Skrevet av: Teodor Heggelund. I denne oppgaven skal vi lage vårt eget spill!

PGZ - Hangman Ekspert Python Lærerveiledning

Hangman. Level. Introduksjon

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Finne ut om en løsning er helt riktig og korrigere ved behov

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

Bygge en pyramide. Introduksjon. Steg 1: Lage en ny mod. Sjekkliste. Skrevet av: Pål G. Solheim

PXT: Himmelfall. Introduksjon. Skrevet av: Helene Isnes og Julie Revdahl

MAT1030 Diskret matematikk

Øvingsforelesning i Python (TDT4110)

MAT1030 Diskret matematikk

Hvor i All Verden? Del 3. Introduksjon. Steg 0: Forrige gang. Sjekkliste. Skrevet av: Geir Arne Hjelle

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

Norsk informatikkolympiade runde

Soloball. Introduksjon. Steg 1: En roterende katt. Sjekkliste. Skrevet av: Geir Arne Hjelle

Steg 1: Installere programvaren

Steg 1: Hvordan styre figurer med piltastene

7-Segment Display. Introduksjon. Steg 1: Finn frem utstyr. Til denne oppgaven trenger du. Skrevet av: Martin Ertsås & Morten Minde Neergaard

Sprettende ball. Introduksjon: Steg 1: Vindu. Sjekkliste. Skrevet av: Sigmund Hansen

IN Seminaroppgaver til uke 11

"Hjerneteppe!" er en huskelek hvor du skal huske stadig lengre rekker med bokstaver!

Øvingsforelesning 3 Python (TDT4110)

Modell, meldinger og oppdatering

Øvingsforelesning i Python (TDT4110)

Løpende strekmann Erfaren Videregående Python PDF

Steg 1: Bli kjent med spillet

Start et nytt PXT-prosjekt, for eksempel ved å gå til makecode.microbit.org (

Skilpaddekunst. Introduksjon. Skrevet av: Geir Arne Hjelle

Steg 1: Lag en figur som bytter drakt

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

Steg 1: Katten og fotballbanen

INF120: Oblig 3. Yngve Mardal Moe

Sikkerhet i GSM mobilteleforsystem

Skilpadder hele veien ned. Steg 1: Tegn et fjell. Sjekkliste. Introduksjon. Hent frem skilpaddene dine, åpne IDLE, det er på tide å tegne igjen.

Skilpadder hele veien ned

PXT: Bjelleklang. Introduksjon. Skrevet av: Kolbjørn Engeland, Julie Revdahl

Hvor i All Verden? Del 1. Introduksjon. Steg 1: Styr et helikopter. Skrevet av: Geir Arne Hjelle

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

"Dette skjer når jeg trykker på denne knappen" "Når jeg skriver i dette feltet, ser jeg at det andre forandrer seg"

Læringsmål og pensum. v=nkiu9yen5nc

Vi har sett enkle datamaskiner. Nå skal vi leke oss med roboter, og finne ut hvordan vi kan få dem til å gjøre forskjellige ting for oss.

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

Transkript:

Hash-funksjoner Skrevet av: Martin Strand Kurs: Python Tema: Tekstbasert, Kryptografi Fag: Matematikk, Programmering Klassetrinn: 8.-10. klasse, Videregående skole Introduksjon Tidligere har vi sett hvordan vi kan sikre at ingen kan lese meldingene vi sender fram og tilbake. Kryptering har også et annet viktig formål, nemlig at ingen skal kunne endre meldingen mens den er på vei til deg. For å forstå hvorfor det er nyttig, tenk deg at du skal betale 200 kr til en venn. Men, når beskjeden din når fram til nettbanken, har den blitt endret til at du vil betale 2 000 kr til læreren din i stedet. Dagens leksjon handler om et verktøy vi har for å hjelpe oss med dette, hash-funksjoner. Steg 1: Strekkoder Vi starter med et eksempel som brukers hver gang vi er i butikken, nemlig strekkoden EAN-13. Finn en bok i nærheten og se på baksiden. Der er det som oftest en strekkode med med 13 sifre under. Det siste sifferet sin jobb er å sjekke om det har skjedd en feil med de 12 andre. Dersom det har skjedd en feil må den som sitter i kassa scanne varen på nytt, men det er langt bedre enn at det blir slått inn en pakke fløte når det egentlig skulle vært melk. Vi skal nå bygge et program som gjør det samme som kassasystemet på nærbutikken din. Regelen er enkel nok: Start med 12 sifre, og del dem opp slik at du jobber med ett og ett. Legg sammen det andre, fjerde, osv. sifferet og multipliser summen med 3. Så legger du sammen første, tredje, femte, osv. siffer og legger til det du har fra før. Se på tallet du nå har fått, og finn ut hvor mye du må legge til for å komme opp til nærmeste tier oppover. Det er sjekksifferet ditt. Husk at når vi jobber med en liste i Python, så er den første på plass 0, så når det står digits[0], så er det det første tallet, og digits[1] er det andre tallet -- og så videre. Eksempel

Jeg har valgt en tilfeldig bok fra bokhylla mi. EAN-13-koden er 9780062731029. La oss sjekke at den er gyldig. Først regner vi ut 3 (7 + 0 + 6 + 7 + 1 + 2) = 69 og 9 + 8 + 0 + 2 + 3 + 0 = 22. 69 + 22 = 91. Den nærmeste tieren oppover er 100, så da er sjekksifferet 9 -- akkurat som det skal være. Sjekkliste Åpne IDLE og lag en ny fil. Lim inn den følgende koden: def verify_barcode(digits): # Regn ut i henhold til formelen sum = 3 * (digits[1] + digits[3] + digits[5] + digits[7] + digits[9] + digits[11]) print(sum) sum = sum + (digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10]) t # Finn differansen mellom 10 og det siste sifferet i summen # Sjekksifferet kan ikke være 10, så den siste % 10 gjør at de # blir 0 i stedet. checksum = (10 - (sum % 10)) % 10 if checksum == digits[12]: return True else: return False Lagre og kjør koden med F5. I konsollen, test koden din med følgende kode: verify_barcode([9,7,8,0,0,6,2,7,3,1,0,2,9]). Test koden din med andre EAN-koder. Se hva som skjer dersom du skriver et galt siffer, eller bytter om rekkefølgen på to. Det er litt slitsomt å skrive inn EAN-koden siffer for siffer. Legg til den følgende koden i fila di:

def interpret_barcode(barcode): # Vi sjekker først at vi faktisk har fått nøyaktig 13 sifre if (len(barcode)!= 13) or not (barcode.isdigit()): return None # Oversett strengen til en liste av sifre digits = [int(d) for d in barcode] return digits Lagre filen. Du kan nå teste den ved å skrive verify_barcode(interpret_barcode("9780062731029")) Sjekk disse strekkodene: 9788205260429 og 978098146739. Hvis noen av sjekksifrene var gale, er du i stand til å finne riktig sjekksiffer? Steg 2: Sterkere koder Sjekksifferet i EAN-13 er godt nok så lenge det handler om å fange opp de feilene som gjøres ved et uhell, men det er ikke spesielt vanskelig å finne to strekkoder som har samme sjekksiffer -- for eksempel holder det at første og tredje siffer bytter plass. For en god hash-funksjon må det (blant annet) være vanskelig å finne to input som gir samme output. Vi skal ikke prøve å programmere våre egne hash-funksjoner, for de er heldigvis innebygd i Python. Alt vi skal gjøre er å lage et lite skall rundt de innebygde funksjonene, slik at de blir enklere å bruke for oss. Hash-funksjonen vi skal bruke nå er god nok til å brukes i så godt som alle situasjoner der man vil ha sterk sikkerhet. Sjekkliste Lim inn den følgende koden i IDLE

from hashlib import sha256 def hash(data): h = sha256() h.update(data.encode()) return h.hexdigest() Lagre filen og kjør den. I konsollen kan du teste hash-funksjonen ved å skrive hash("978006273102"). Se hva som skjer dersom du bare endrer tallet bittelitt. Steg 3: Sikring av Cæsar-chifferet Tidligere har du programmert Cæsar-chifferet. Men, en av de mange svakhetene der er at hvis du sender meldingen med et bud, så kan budet bare legge inn en helt ny melding. Antageligvis blir det helt uforståelig når det dekrypteres, men det er ingen måte mottakeren kan avgjøre om det er du som har gjort en feil, eller om det er budet som har endret på meldingen. Det kan vi nå gjøre noe med. I koden til Cæsar-chifferet er det en variabel som heter secrets. Den skal vi bruke her også. I koden bruker vi forkortelsen mac, den står for message authentication code. Lag en ny fil i IDLE Legg til de følgende funksjonene i fila di secret = 17 message = "yvååc kcfåu" def mac(key, message): return (message, hash(str(key) + message)) def verify_mac(key, message, mac): if mac == hash(str(key) + message): return "Alt ok" else: return "Noen har tuklet med meldingen!" Lagre og kjør. Prøv mac(secret, message). Det du skal sende til mottakeren nå er ikke bare yvååc kcfåu, men ('yvååc kcfåu', 'b5a1c943bf39423f55a6fa4e43a7642feddd371c355ec4560b2f360a2634d244').

Mottakeren (eller du selv) skriver følgende: verify_mac(secret, 'yvååc kcfåu', 'b5a1c943bf39423f55a6fa4e43a7642feddd371c355ec4560b2f360a2634d244'). Det skal da komme en beskjed om at alt er i OK. Prøv å endre på enten meldingen eller hash-verdien. Hva får du da beskjed om? Sett sammen denne koden med det du har gjort i Cæsar-chifferet og lag en ny funksjon encrypt_and_mac som både krypterer og legger til en MAC som over. (Hint: I Python kan du returnere flere verdier ved å skrive return (value1, value2).) Så lenge nøkkelen er hemmelig er det ingen måte å endre meldingen på uten at det blir fanget opp. Det vi har gjort nå minner litt om det som gjøres i program som brukes til viktige oppgaver. Forskjellen er så klart at de bruker en mye større nøkkel, og i tillegg at nøkkelen inkluderes på en litt smartere måte. Vi skal ikke prøve å forstå hvorfor her, det kommer først på universitetet. Lisens: CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0/deed)