Eindopdracht: Geheime Communicatie

Netwerken & Security / niveau 3

Bij deze eindopdracht moesten we een beveiligd chat systeem maken met verschillende beveiligingssystemen.

Hieronder staan als eerst de link naar het verslag. Daarna staat er per fase de code met daarbij een video en af en toe een screenshot. De code is alleen van de ontvanger (vanaf fase 4 is het twee-weg chat, dus hetzelfde als verzender), de video's zijn met alle drie de rollen en de foto's zijn alleen van de onderschepper.

Verslag (PDF)

Fase 2

from microbit import *
import radio

radio.on()
radio.config(group=102)

bericht = ""

while True:
    msg = radio.receive()
    if msg:
        if msg == "END":
            radio.send("OK")
            print(bericht)
            display.scroll(bericht)
            bericht = ""
        else:
            # Ontvangen tekst omzetten naar getal
            getal = int(msg)
            
            # Getal omzetten naar letter
            letter = chr(getal)
            
            bericht = bericht + letter
            display.show(".")

Fase 3

from microbit import *
import radio

radio.on()
radio.config(group=102)

bericht = ""
key = 4

while True:
    msg = radio.receive()
    
    if button_b.was_pressed():
        if key == 25:
            key = 0
            display.scroll(key)
        else:
            key += 1
            display.scroll(key)

    if msg:
        if msg == "END":
            radio.send("OK")
            print(bericht)
            display.scroll(bericht)
            bericht = ""
            if key == 25:
                key = 0
            else:
                key += 1
        else:
            # Ontvangen tekst omzetten naar getal
            getal = int(msg) - key
            
            # Getal omzetten naar letter
            letter = chr(getal)
            
            bericht = bericht + letter
            display.show(".")

Fase 4

from microbit import *
import radio

radio.on()
radio.config(group=102)

bericht = ""
key = 4
bit = "A"
otherbit = "B"

while True:
    msg = radio.receive()
    
    if button_b.was_pressed():
        if key == 25:
            key = 0
            display.scroll(key)
        else:
            key += 1
            display.scroll(key)

    if button_a.was_pressed():
        bericht = ""
        bericht = input("Wat wil je verzenden? ")
        print("Je hebt verstuurd: ", bericht)

        display.show(Image.ARROW_N)

        for letter in bericht:  
            # Stuur het getal als tekst
            radio.send(bit + str(ord(letter) + key))
            sleep(100)
            
        # Stuur het getal als tekst
            
        radio.send(bit + "END")

        bericht = ""

        start = running_time()
        timeout = 10000 
        key = key + 1
        if key == 26:
            key = 0
        print("Key: ", key)
        while True:
            msg = radio.receive()
            if msg:
                if msg == otherbit + "OK":
                    # Bericht is compleet! Laat zien.
                    display.show(Image.YES)
                else:
                    display.show(Image.NO)

                break
            if running_time() - start > timeout:
                display.show(Image.NO)
                break

    if msg and msg.startswith(otherbit):
        if msg == otherbit + "END":
            radio.send(bit + "OK")
            print("Je hebt ontvangen: ", bericht)
            display.show(Image.YES)
            bericht = ""
            if key == 25:
                key = 0
            else:
                key += 1
            print("Key: ", key)
        else:
            inhoud = msg[1:]
            if inhoud.isdigit():
                getal = int(inhoud) - key
                letter = chr(getal)
                bericht = bericht + letter
                display.show(".")

Fase 5

from microbit import *
import radio

radio.on()
radio.config(group=102)

bericht = ""
default_key = 4
keys = {}
bit = "A"

while True:
    msg = radio.receive()

    if button_a.was_pressed():
        bericht = ""
        otherbit = ""
        otherbit = input("Naar welke bit wil je verzenden? ")
        if otherbit not in keys:
            keys[otherbit] = default_key
        bericht = input("Wat wil je verzenden? ")
        print("Je hebt naar " + otherbit + " verstuurd: ", bericht)

        key = keys[otherbit]

        display.show(Image.ARROW_N)

        for letter in bericht:  
            # Stuur het getal als tekst
            radio.send(otherbit + str(ord(letter) + key) + bit)
            sleep(100)
            
        # Stuur het getal als tekst
            
        radio.send(otherbit + "END" + bit)

        bericht = ""

        start = running_time()
        timeout = 10000 
        keys[otherbit] += 1
        if keys[otherbit] == 26:
            keys[otherbit] = 0
        print("Key for " + otherbit + " : " + str(keys[otherbit]))
        while True:
            msg = radio.receive()
            if msg:
                if msg == otherbit + "OK":
                    # Bericht is compleet! Laat zien.
                    display.show(Image.YES)
                else:
                    display.show(Image.NO)

                break
            if running_time() - start > timeout:
                display.show(Image.NO)
                break

    if msg and msg.startswith(bit):
        if msg.startswith(bit + "END"):
            radio.send(bit + "OK")
            print("Je hebt van " + msg[msg.find("END") + 3] + " ontvangen: ", bericht)
            sender = msg[msg.find("END") + 3]
            if sender not in keys:
                keys[sender] = default_key
            display.show(Image.YES)
            bericht = ""
            keys[sender] += 1
            if keys[sender] == 26:
                keys[sender] = 0
            print("Key for " + sender + ": ", keys[sender])
        else:
            inhoud = msg[1:-1]
            if inhoud.isdigit():
                sender = msg[-1]
                if sender not in keys:
                    keys[sender] = default_key
                getal = int(inhoud) - keys[sender]
                letter = chr(getal)
                bericht = bericht + letter
                display.show(".")

Fase 6

from microbit import *
import radio

radio.on()
radio.config(group=102)

bericht = ""
default_key = 4
keys = {}
bit = "A"
retries = 0
failed = 0
succeeded = 0

while True:
    msg = radio.receive()

    if button_a.was_pressed():
        retries = 0
        bericht = ""
        otherbit = ""
        otherbit = input("Naar welke bit wil je verzenden? ")
        if otherbit not in keys:
            keys[otherbit] = default_key
        bericht = input("Wat wil je verzenden? ")
        print("Je hebt naar " + otherbit + " verstuurd: ", bericht)

        key = keys[otherbit]

        display.show(Image.ARROW_N)

        while retries < 5:
            for letter in bericht:
                radio.send(otherbit + str(ord(letter) + key) + bit)
                sleep(100)
        
            radio.send(otherbit + "END" + bit)
        
            start = running_time()
            timeout = 10000
            while True:
                msg = radio.receive()
                if msg:
                    if msg == otherbit + "OK":
                        display.show(Image.YES)
                        retries = 5
                        keys[otherbit] += 1
                        if keys[otherbit] == 26:
                            keys[otherbit] = 0
                        print("Key for " + otherbit + " : " + str(keys[otherbit]))
                        bericht = ""
                        succeeded += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                    else:
                        retries += 1
                        print("Wrong ACK, retry:", retries)
                        if retries >= 5: 
                            display.show(Image.NO)
                            print("ACK timeout")
                            bericht = ""
                            failed += 1
                            print("Stats:")
                            print("Berichten gelukt: ", succeeded)
                            print("Berichten mislukt: ", failed)
                        else:
                            display.show(Image.ARROW_N)
                    break
        
                if running_time() - start > timeout:
                    retries += 1
                    print("Timeout, retry:", retries)
                    if retries >= 5:
                        display.show(Image.NO)
                        print("ACK timeout")
                        bericht = ""
                        failed += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                    else:
                        display.show(Image.ARROW_N)
                    break

    if msg and msg.startswith(bit):
        if msg.startswith(bit + "END"):
            radio.send(bit + "OK")
            print("Je hebt van " + msg[msg.find("END") + 3] + " ontvangen: ", bericht)
            sender = msg[msg.find("END") + 3]
            if sender not in keys:
                keys[sender] = default_key
            display.show(Image.YES)
            bericht = ""
            keys[sender] += 1
            if keys[sender] == 26:
                keys[sender] = 0
            print("Key for " + sender + ": ", keys[sender])
        else:
            inhoud = msg[1:-1]
            if inhoud.isdigit():
                sender = msg[-1]
                if sender not in keys:
                    keys[sender] = default_key
                getal = int(inhoud) - keys[sender]
                letter = chr(getal)
                bericht = bericht + letter
                display.show(".")

Fase 7

De key per letter verhogen in plaats van per bericht, hierdoor zal bijvoorbeeld de E niet meerdere keren met hetzelfde getal voorkomen.

Fase 8

from microbit import *
import radio
import random

radio.on()
radio.config(group=102)

bericht = ""
berichtf = ""
default_key = 4
keys = {}
bit = "A"
retries = 0
failed = 0
succeeded = 0
lettercount = 0
berichtlock = False
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 '

while True:
    msg = radio.receive()

    if button_a.was_pressed():
        retries = 0
        bericht = ""
        berichtf = ""
        lettercount = 0
        otherbit = ""
        otherbit = input("Naar welke bit wil je verzenden? ")
        if otherbit not in keys:
            keys[otherbit] = default_key
        bericht = input("Wat wil je verzenden? ")
        lengte = len(bericht)
        if lengte > 100:
            print("Lengte bericht meer dan 100, dus afgeknipt bij 100 tekens.")
            bericht = bericht[:100]
        print("Je hebt naar " + otherbit + " verstuurd: ", bericht)

        key = keys[otherbit]

        display.show(Image.ARROW_N)

        while retries < 5:
            lettercount = 0
            
            for letter in bericht:
                radio.send(otherbit + str(ord(letter) + key) + bit)
                lettercount += 1
                sleep(100)

            radio.send(otherbit + str(3 + key) + bit)
            lettercount += 1
            sleep(100)
            
            lettercountrev = 100 - lettercount
            while lettercountrev > 0:
                radio.send(otherbit + str(ord(random.choice(letters)) + key) + bit)
                lettercountrev -= 1
                sleep(50)
            
            radio.send(otherbit + "END" + bit)
        
            start = running_time()
            timeout = 15000
            while True:
                msg = radio.receive()
                if msg:
                    if msg == otherbit + "OK":
                        display.show(Image.YES)
                        retries = 5
                        keys[otherbit] += 1
                        if keys[otherbit] == 26:
                            keys[otherbit] = 0
                        print("Key for " + otherbit + " : " + str(keys[otherbit]))
                        bericht = ""
                        berichtf = ""
                        succeeded += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                        print("")
                    else:
                        retries += 1
                        print("Wrong ACK, retry:", retries)
                        if retries >= 5: 
                            display.show(Image.NO)
                            print("ACK timeout")
                            bericht = ""
                            berichtf = ""
                            failed += 1
                            print("Stats:")
                            print("Berichten gelukt: ", succeeded)
                            print("Berichten mislukt: ", failed)
                            print("")
                        else:
                            display.show(Image.ARROW_N)
                    break
        
                if running_time() - start > timeout:
                    retries += 1
                    print("Timeout, retry:", retries)
                    if retries >= 5:
                        display.show(Image.NO)
                        print("ACK timeout")
                        bericht = ""
                        berichtf = ""
                        failed += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                        print("")
                    else:
                        display.show(Image.ARROW_N)
                    break

    if msg and msg.startswith(bit):
        if msg.startswith(bit + "END"):
            berichtlock = False
            radio.send(bit + "OK")
            print("Je hebt van " + msg[msg.find("END") + 3] + " ontvangen: ", bericht)
            print("Je hebt van " + msg[msg.find("END") + 3] + " volledig ontvangen: ", berichtf)
            sender = msg[msg.find("END") + 3]
            if sender not in keys:
                keys[sender] = default_key
            display.show(Image.YES)
            bericht = ""
            berichtf = ""
            keys[sender] += 1
            if keys[sender] == 26:
                keys[sender] = 0
            print("Key for " + sender + ": ", keys[sender])
            print("")
        else:
            inhoud = msg[1:-1]
            if inhoud.isdigit():
                sender = msg[-1]
                if sender not in keys:
                    keys[sender] = default_key
                getal = int(inhoud) - keys[sender]
                if getal == 3:
                    berichtlock = True
                letter = chr(getal)
                if berichtlock == True:
                    bericht = bericht
                    berichtf = berichtf + letter
                else:
                    bericht = bericht + letter
                    berichtf = berichtf + letter
                display.show(".")

Fase 9

from microbit import *
import radio
import random

radio.on()
radio.config(group=102)

bericht = ""
berichtf = ""
default_key = 4
keys = {}
bit = "A"
retries = 0
failed = 0
succeeded = 0
lettercount = 0
berichtlock = False
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 '

while True:
    msg = radio.receive()

    if button_a.was_pressed():
        retries = 0
        bericht = ""
        berichtf = ""
        lettercount = 0
        otherbit = ""
        otherbit = input("Naar welke bit wil je verzenden? ")
        if otherbit not in keys:
            keys[otherbit] = default_key
        if input("Wil je 'tekst' of 'foto' versturen?") == "tekst":
            bericht = input("Wat wil je verzenden? ")
        else:
            print("Kies een foto om te versturen.")
            print("1: Hart")
            print("2: Klein hart")
            print("3: Gelukkig")
            print("4: Lach")
            print("5: Zielig")
            print("6: Verward")
            print("7: Boos")
            print("8: Slapend")
            print("9: Verrast")
            print("10: Gek")
            print("11: Geweldig")
            print("12: Ja")
            print("13: Nee")
            print("14: Meh")
            print("15: Eend")
            print("16: Giraffe")
            print("17: Pacman")
            print("18: Geest")
            print("19: Schedel")
            nummer = input("Welke foto wil je versturen? ")
            while not nummer.isdigit():
                print("Geef alleen het nummer.")
                nummer = input("Welke foto wil je versturen? ")

            nummer = int(nummer)
            bericht = "ifedvkm:"

            if nummer == 1:
                bericht = bericht + "HEART"
            elif nummer == 2:
                bericht = bericht + "HEART_SMALL"
            elif nummer == 3:
                bericht = bericht + "HAPPY"
            elif nummer == 4:
                bericht = bericht + "SMILE"
            elif nummer == 5:
                bericht = bericht + "SAD"
            elif nummer == 6:
                bericht = bericht + "CONFUSED"
            elif nummer == 7:
                bericht = bericht + "ANGRY"
            elif nummer == 8:
                bericht = bericht + "ASLEEP"
            elif nummer == 9:
                bericht = bericht + "SURPRISED"
            elif nummer == 10:
                bericht = bericht + "SILLY"
            elif nummer == 11:
                bericht = bericht + "FABULOUS"
            elif nummer == 12:
                bericht = bericht + "YES"
            elif nummer == 13:
                bericht = bericht + "NO"
            elif nummer == 14:
                bericht = bericht + "MEH"
            elif nummer == 15:
                bericht = bericht + "DUCK"
            elif nummer == 16:
                bericht = bericht + "GIRAFFE"
            elif nummer == 17:
                bericht = bericht + "PACMAN"
            elif nummer == 18:
                bericht = bericht + "GHOST"
            elif nummer == 19:
                bericht = bericht + "SKULL"
            
            print("dit is het bericht: " + bericht)
        lengte = len(bericht)
        if lengte > 100:
            print("Lengte bericht meer dan 100, dus afgeknipt bij 100 tekens.")
            bericht = bericht[:100]
        print("Je hebt naar " + otherbit + " verstuurd: ", bericht)

        key = keys[otherbit]

        display.show(Image.ARROW_N)

        while retries < 5:
            lettercount = 0
            
            for letter in bericht:
                radio.send(otherbit + str(ord(letter) + key) + bit)
                lettercount += 1
                sleep(100)

            radio.send(otherbit + str(3 + key) + bit)
            lettercount += 1
            sleep(100)
            
            lettercountrev = 100 - lettercount
            while lettercountrev > 0:
                radio.send(otherbit + str(ord(random.choice(letters)) + key) + bit)
                lettercountrev -= 1
                sleep(50)
            
            radio.send(otherbit + "END" + bit)
        
            start = running_time()
            timeout = 15000
            while True:
                msg = radio.receive()
                if msg:
                    if msg == otherbit + "OK":
                        display.show(Image.YES)
                        retries = 5
                        keys[otherbit] += 1
                        if keys[otherbit] == 26:
                            keys[otherbit] = 0
                        print("Key for " + otherbit + " : " + str(keys[otherbit]))
                        bericht = ""
                        berichtf = ""
                        succeeded += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                        print("")
                    else:
                        retries += 1
                        print("Wrong ACK, retry:", retries)
                        if retries >= 5: 
                            display.show(Image.NO)
                            print("ACK timeout")
                            bericht = ""
                            berichtf = ""
                            failed += 1
                            print("Stats:")
                            print("Berichten gelukt: ", succeeded)
                            print("Berichten mislukt: ", failed)
                            print("")
                        else:
                            display.show(Image.ARROW_N)
                    break
        
                if running_time() - start > timeout:
                    retries += 1
                    print("Timeout, retry:", retries)
                    if retries >= 5:
                        display.show(Image.NO)
                        print("ACK timeout")
                        bericht = ""
                        berichtf = ""
                        failed += 1
                        print("Stats:")
                        print("Berichten gelukt: ", succeeded)
                        print("Berichten mislukt: ", failed)
                        print("")
                    else:
                        display.show(Image.ARROW_N)
                    break

    if msg and msg.startswith(bit):
        if msg.startswith(bit + "END"):
            berichtlock = False
            radio.send(bit + "OK")
            if bericht.startswith("ifedvkm:"):
                foto = bericht.split(":")[1]
                plaatje = getattr(Image, foto)
                display.show(plaatje)
                print("Je hebt een foto ontvangen van " + msg[msg.find("END") + 3])
                sleep(1000)
            else:
                print("Je hebt van " + msg[msg.find("END") + 3] + " ontvangen: ", bericht)
                print("Je hebt van " + msg[msg.find("END") + 3] + " volledig ontvangen: ", berichtf)
                display.show(Image.YES)
            sender = msg[msg.find("END") + 3]
            if sender not in keys:
                keys[sender] = default_key
            bericht = ""
            berichtf = ""
            keys[sender] += 1
            if keys[sender] == 26:
                keys[sender] = 0
            print("Key for " + sender + ": ", keys[sender])
            print("")
        else:
            inhoud = msg[1:-1]
            if inhoud.isdigit():
                sender = msg[-1]
                if sender not in keys:
                    keys[sender] = default_key
                getal = int(inhoud) - keys[sender]
                if getal == 3:
                    berichtlock = True
                letter = chr(getal)
                if berichtlock == True:
                    bericht = bericht
                    berichtf = berichtf + letter
                else:
                    bericht = bericht + letter
                    berichtf = berichtf + letter
                display.show(".")