Olika former av kryptering har använts så länge man har velat ha skriftliga hemligheter. Redan dom gamla grekerna hade flera system för kryptering.
Samma effekt kan vi få genom att skriva meddelandet i en mxn-matris och bilda det kodade meddelandet genom att ta varje kolumn i texten. Den som känner till matrisens storlek kan lätt avkoda det. Man brukar skippa mellanslag och skiljetecken för att göra det svårare att knäcka koden.
JAGGÖ MMERP ENGAR NAIDE NGAML AEKENkodas alltså som:
JMENNAAMNAGEGEGIAKGRADMEÖPRELN
En variant är rot13 där man förskjuter varje bokstav 13 steg. Hamnar man utanför alfabetet roterar man runt till början igen.
def rot13(meddelande): alfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" kod = "" for bokstav in meddelande: index = (alfabet.find(bokstav) + 13) % 26 kod = kod + alfabet[index] return kodOm vi skippar ÅÄÖ får vi ett alfabet som består av 26 tecken, vilket innebär att vi kan använda samma funktion för dekryptering!
rot13("HEMLIGHETER") blir URZYVTURGRE rot13("URZYVTURGRE") blir HEMLIGHETERÄnnu hemligare blir det om vi slumpar fram en mappning istället för att flytta fram ett visst antal steg.
ABCDEFGHIJKLMNOPQRSTUVWXY ||||||||||||||||||||||||| FSXNVDQBCULRHKTPAOMWJEIGYAlla dessa chiffer är dock enkla att knäcka om man har statistik över hur ofta varje bokstav förekommer i det aktuella språket. Så här ser det ut för svenska:
Det är ett enkelt men mycket effektivt chiffer där man använder en bok som nyckel. Man letar rätt på ordet i boken och skriver ner sidnummer samt ordets nummer på sidan, t ex
534 13 127 220 10 109 220 129Den ena siffran anger sidan och den andra anger vilket ord på sidan det är. (Man kan använda bokstäver istället för ord, men då ska det vara en tjock bok.)
Krypteringsalgoritmen RSA (döpt efter Ron Rivest, Adi Shamir och Leonard Adleman som först publicerade den) är ett exempel på asymmetrisk kryptering. Du har en offentlig nyckel och en privat nyckel. Den offentliga nyckeln delar du ut till alla, så att dom kan kryptera meddelanden och skicka till dig, men det är bara du som kan dekryptera med hjälp av den privata nyckeln.
Först måste vi beräkna nycklarna:
Sedan beräknar vi mie modulo n för att få de kodade delarna ci.
Den som vill dekryptera måste känna till d, och kan då få ut det ursprungliga meddelandet genom att beräkna cid modulo n för varje ci.
På University of Illinois har man gjort en demo av RSA, prova gärna!
För att knäcka RSA måste man faktorisera n, dvs lista ut vilka de två stora primtalen p och q är. Det finns ännu ingen algoritm som kan göra detta i polynomisk tid, dvs O(Lk) där L är längden av primtalet och k är en godtycklig konstant, vilket innebär att beräkningen tar för lång tid för att vara praktiskt användbar. Därför räknar man med att RSA i nuläget är oknäckbar för tillräckligt stora primtal.
Ovannämnda algoritmer är publika och man kan matematiskt verifiera att de fungerar. Det som är hemligt är nycklarna. Att hemlighålla algoritmen (security by obscurity) bör betraktas med skepsis. Under 2013 läckte Edward Snowden hemligt material i huvudsak från amerikanska NSA vilket bekräftat bilden av att algoritmerna i huvudsak håller men att det finns mängder med andra säkerhetsproblem.Exempelvis skulle en lösenordsfunktion:
def testaHemligtPassword( password ): if password == "123aabbccdd" : return True else: return Falsekunna skrivas så här:
def dunkeltPasswordsTest(password): hårdkodat_salt = "123£"!#¤!..." hårdkodat_saltat_och_hashat_lösen = "312sd3$£$#!SESD..." hashat_password = hashfunc( password + hårdkodat_salt) if hashat_password == hårdkodat_saltat_och_hashat_lösen : return True else: return FalseGivet koden är det svårt att gissa lösenordet
Det finns bra och dåliga lösenord. I mars 2013 anordnade nättidiningen Ars Technica en tävling att gissa hashade lösenord. Artikeln beskriver hur lösenordsgissningsalgoritmerna jobbar. Bl.a. används befintliga lösenord som algoritmen hakar på suffix och prefix. Bruce Schneier är en säkerhetsexpert som bloggar om datasäkerhet och ger en del råd om lösenord.
Kontrollera t ex:
En fortsättningskurs som bland annat handlar om tillämpningar av kryptering är DD2395 Datasäkerhet. Där får man också lära sig om t ex virus och datajuridik.
Säkerhetsaspekter tas även upp i kursen DD1334 Databasteknik som vissa av er läser redan i vår.
Vi har förstås också kursen DD2448 Kryptografins grunder (men den kräver att man läst DD1352 ADK först).