Kryptering forts, testning på Kattis, algoritmer, obskyr kod

Kryptering forts

Assymetrisk kryptering (RSA) förutsätter nyckelpar. En publik och en privat nyckel hos vardera part. Man krypterar med mottagerens publika nyckel och signerar med sin egen privata nyckel. Mottagaren dekrypterar med sin privata nyckel och autentiserar med sändarens publika nyckel.

Vid symmetrisk kryptering har sändare och mottagare samma krypteringsnyckel. Det går i regel mycket fortare än assymetrisk kryptering. Standarden idag är AES, tidigare var det DES.

Ovannämnda algoritmer är publika och matematiskt verifierbara 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 hemlig 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.

Attacker på kryptering är t.ex. man-in-the-middle attacker. Ibland har det smugits in (oklart hur) svagheter i implementeringen, t.ex. slumptalsgeneratorn, av annars starka system. Vissa system är bevisligen mycket svaga men används ändå t.ex. lokaltrafikkortlösningar.

Ett simpelt men mycket effektivt chiffer är bokchiffer. Man använder en bok, t.ex. bibeln, som nyckel och kodar texten genom att ange ett par siffror för vaje bokstav/ord. Den ena siffran anger sidan och den andra anger vilken bokstav/ord på sidan det är. E

Lösenord

Lösenord bör sparas saltade och hashade. 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 blogga om datasäkerhet och ger en del råd om lösenord.

Dekompilera kod

Under 2014 publicerads två artiklar (1, 2) som kunde visa att det går att skriva kod som inte går att hacka. Definitionen på ej hackningsbar skulle vara att den som har tillgång till källkoden inte vet mer än den som har den kompilerade koden. För den senare fungerar koden som en svart låda (black box). Exempelvis skulle en lösenordsfunktion:
def testaHemligtPassword( password ):
   if (password = "123aabbccdd") :
       return true
   else: 
       return false
Skrivas typ 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 false
Givet koden är det svårt att gissa lösenordet

Kattis

Kattis: Ett automatiskt system för rättning av labbar

Kattis började i form av Marvin, som användes för att rätta inlämningarna i programmeringstävlingskursen

DD2458 (programmering och problemlösning under press), men används numera även i DD1352 (Algoritmer, Datastrukturer och Komplexitet) och DD2387 (Programsystemkonstruktion med C++).

Kattis är skrivet i en kombination av Python, PHP och SQL och körs på en Ubuntu-server. En specialbyggd säkerhetslösning används för att hindra fusk. All inskickad kod lagras också för att senare kunna kontrollera koden ifall det skulle behövas.

Den pedagogiska tanken med Kattis är att eleverna skall kunna sända in sin kod och snabbt få svar på huruvida koden fungerar. Kattis skall även ge eleverna övning i att söka efter buggar i koden. Kattis har utvecklats av följande personer:

Övriga som hjälpt till är:

Hur ska jag göra?

  1. Följ länken: Kattis
  2. Logga in (längst upp till höger) med ditt KTH-id
  3. Välj "Kurser" i övre blå menyn
  4. Välj "tilda12" (långt ner i listan)
  5. Klicka på "Jag är student på den här kursen och vill registrera mig på Kattis."
  6. Välj "Problemlista".
    Här finns två testproblem (hello och different) och labb 6 (formelkoll2)
  7. Välj "Skicka in" för att komma till inskickningssidan.
  8. Fyll i fälten "Problem ID" och "Språk"
  9. Välj en fil (ditt python-program)
  10. Tryck på knappen "Skicka in"
  11. Uppdatera webbsidan för att få se Domarstatus.
Använd testproblemen för att lista ut hur Kattis fungerar innan du skickar in din lösning till labb6!

Indata

Programmen du skickar till Kattis ska läsa indata från stdin.
Det fungerar som att läsa från fil! Exempel:

from sys import stdin
from formelkollPaket import * #För att inte hela labben ska synas ;-)

def main():
    #stdin = open("indata1.txt") #Lätt att ändra för att testa indata från fil
    rad = stdin.readline()
    while rad[0] != "#":
        q = LinkedQ()
        for tkn in rad:
            q.put(tkn)
        try:
            readformel(q)
            print("Formeln är syntaktiskt korrekt")
        except Syntaxfel as felet:
            rest = str(q).strip()
            print(felet, "vid radslutet", rest)
        rad = stdin.readline()

main()

Utdata

Utdata kan du skriva ut med print som vanligt.
print(x)

Syntaxfel

Definiera ditt eget särfall som en subklass till Exception. Du behöver inte göra egna metoder - allt som finna i Exception ärvs av din klass.
Exempel (Python 3):
class Syntaxfel(Exception):
    pass

def readformel(q):
    ...
        raise Syntaxfel("Felaktig gruppstart")

Moment LAB1

Man måste bli godkänd på laborationsdelen (dvs redovisa alla sju labbarna) för att bli godkänd på kursen.

Utnyttja gärna allmänhandledningen!
Fråga på KTH social om du är helt säker på att ditt program är klart och korrekt, men ändå inte blir godkänt av Kattis. Ange inskickningsid.

Flödesdiagram

I industrin används ofta flödesschema för att illustrera algoritmer. Den enklaste formen av flödesdiagram har två sorters figurer, en rektangel för instruktioner och en diamantformad figur för val (if-satser). Mellan figurerna ritar man pilar för att visa flödet.