Het veilig verzenden van een sleutel naar een ontvanger is al jarenlang een probleem. De verzender en ontvanger moeten overeenstemming bereiken over een sleutel en deze geheimhouden. Als zij zich op verschillende locaties bevinden, moeten zij een vertrouwde koerier gebruiken of een andere veilige communicatiemethode om de sleutel te delen en openbaarmaking tijdens de overdracht te voorkomen. Iedereen die tijdens de overdracht toegang heeft tot de sleutel, kan de versleutelde informatie zonder toestemming lezen, wijzigen en vervalsen.
 

De problemen van sleutelverdeling worden opgelost door asymmetrische cryptografie, ook wel public-key-cryptografie genoemd. Dit concept werd in 1975 geïntroduceerd door Whitfield Diffie en Martin Hellman. Public-key-cryptografie gebruikt wiskundige technieken die eenvoudig in één richting te berekenen zijn, maar extreem moeilijk in omgekeerde richting. Asymmetrische cryptografie vereenvoudigt de uitwisseling van sleutels via een onbeveiligd medium aanzienlijk. Veelgebruikte asymmetrische algoritmen zijn RSA (Rivest-Shamir-Adleman) en ECC (Elliptic Curve Cryptography). RSA is gebaseerd op het ontbinden van grote priemgetallen, wat uiterst moeilijk is, terwijl ECC kleinere sleutellengtes en minder rekenkracht gebruikt.
 

AES (Advanced Encryption Standard) is een symmetrisch versleutelingsalgoritme dat dezelfde sleutel gebruikt voor zowel versleuteling als ontsleuteling en veel wordt toegepast voor snelle gegevensversleuteling, terwijl asymmetrische algoritmen zoals RSA doorgaans worden gebruikt voor veilige sleuteluitwisseling.
 

In dit artikel richten we ons op het gebruik van RSA samen met AES om een veilig communicatiesysteem tussen twee embedded apparaten te implementeren.
 

Elektor Green Memebrship 4-2026

Veilige communicatie tussen twee partijen met AES en RSA

De onderstaande opmerkingen zijn gebaseerd op het gebruik van de AES-256-codering in ECB-modus en RSA-1024 public/private-sleutelgeneratie om veilige communicatie tussen twee nodes tot stand te brengen. U kunt desgewenst dezelfde stappen gebruiken voor AES-GCM-modus en/of langere RSA-sleutellengtes. In het volgende gedeelte wordt een volledig Raspberry Pi 5-programma gegeven om de communicatie eenvoudig op te zetten.
 

1. Een bericht verzenden

• Haal de publieke sleutel van de tweede partij op

• Versleutel uw leesbare tekst met de AES-256-codering om ciphertext te genereren. U kunt desgewenst identificatiewoorden opnemen in de leesbare tekst

• Versleutel uw AES-256-sleutel met RSA

• Verstuur de AES-ciphertext en de met RSA versleutelde sleutel naar de tweede partij, bijvoorbeeld via e-mail of een andere communicatiemethode

• De tweede partij gebruikt zijn private sleutel om de AES-256-sleutel te ontsleutelen

• De tweede partij gebruikt de AES-256-versleuteling met de gedecodeerde sleutel om de versleutelde tekst te decoderen en de leesbare tekst te genereren
 

2. Een bericht ontvangen

• Genereer een publieke en private sleutel met RSA

• Verstuur de publieke sleutel naar de tweede partij, bijvoorbeeld via e-mail of een andere communicatiemethode

• Ontvang de met RSA versleutelde AES-256-sleutel en AES-256-ciphertext van de tweede partij

• Ontsleutel de AES-256-sleutel met het RSA-ontsleutelingsalgoritme

• Gebruik de ontsleutelde AES-256-sleutel om de ciphertext te ontsleutelen en de leesbare tekst te verkrijgen(fixed)
 

Volledig programma om berichten te verzenden/ontvangen

Dit is een volledig programma voor veilige communicatie. De gebruiker krijgt de mogelijkheid om een private/public-sleutelpaar aan te maken, de publieke sleutel van de tweede partij en de leesbare tekst in te voeren, en ook de private sleutel in te voeren om de sleutel en het bericht te ontsleutelen.
 

Listing 1 toont de programmalisting (Programma: RSASendReceive.py). De Crypto-bibliotheek wordt in het programma geïmporteerd. Het programma wordt uitgevoerd met PuTTY via de SSH-verbinding. De reden hiervoor is dat gegevens eenvoudig kunnen worden gekopieerd en geplakt met PuTTY, maar niet in Thonny.


Listing 1. Programma RSASendreceive.py (fragment).

from Crypto.PublicKey import RSA
from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad
import base64

KEY_SIZE = 1024  # can be changed

 

def aes256_decrypt(key, ciphertext):
    cipher = AES.new(key, AES.MODE_ECB)
    padded = cipher.decrypt(ciphertext)
    pad_len = padded[-1]
    return padded[:-pad_len]

 

def print_red(s):
    print("\033[91m%s\033[0m" % s)

 

# Main program

while True:
    print("\n\nG Generate and display new public/private key")
    print("P Read second party's public key, read plaintext, generate ciphertext using AES-256")
    print("R Read from second party: RSA encrypted key and ciphertext to decrypt plaintext")
    print("X to Exit")

    mode = input("Mode: ")

    if mode == "G":
        key = RSA.generate(KEY_SIZE)
        private_pem = key.export_key()
        public_pem = key.publickey().export_key()

        print(private_pem.decode())
        print(public_pem.decode())

    elif mode == "P":
        rsa_pub_pem = input("Enter PUBLIC KEY:\n")
        rsa_pub_key = RSA.import_key(rsa_pub_pem)

        aes_key = get_random_bytes(32)
        rsa_cipher = PKCS1_v1_5.new(rsa_pub_key)
        encrypted_aes_key = rsa_cipher.encrypt(aes_key)

        plaintext = input("Enter plaintext: ").encode()
        plaintext_padded = pad(plaintext, AES.block_size)

        aes_cipher = AES.new(aes_key, AES.MODE_ECB)
        ciphertext = aes_cipher.encrypt(plaintext_padded)

        print(base64.b64encode(encrypted_aes_key).decode("utf-8"))
        print(ciphertext.hex().upper())

    elif mode == "R":

        ...

        private_pem = input("Enter PRIVATE KEY:\n")
        rsa_key = RSA.import_key(private_pem)
        cipher_rsa = PKCS1_v1_5.new(rsa_key)

        ...

        enc_b64 = input("Enter encrypted AES key (Base64): ")
        encrypted_bytes = base64.b64decode(enc_b64)

        sentinel = b"FAILED"
        aes_key = cipher_rsa.decrypt(encrypted_bytes, sentinel)

        ...

        hex_input = input("Enter ciphertext (Hex): ").replace(" ", "")
        ciphertext = bytes.fromhex(hex_input)

        decrypted = aes256_decrypt(aes_key, ciphertext)
        print(decrypted.decode("utf-8"))

    elif mode == "X":
        break


Het volgende menu wordt weergegeven wanneer het programma wordt uitgevoerd:

 

while True:

    print("\n\nG Generate and display new public/private key")

    print("P Read second party's public key,read plaintext,generate ciphertext using AES-256")

    print("R Read from second party: RSA encrypted key and ciphertext to decrypt plaintext")

    print("X to Exit")

    print()

    mode = input("Mode: ")

 

Wanneer optie G wordt geselecteerd, wordt een RSA public/private-sleutelpaar gegenereerd met de sleutellengte ingesteld door KEY_SIZE. Hoewel KEY_SIZE is ingesteld op 1024, kan deze worden verhoogd voor extra beveiliging. Zowel de gegenereerde publieke als private sleutel worden in PEM-formaat op het scherm weergegeven, zodat ze later indien nodig kunnen worden gekopieerd en geplakt.
 

Wanneer optie P wordt geselecteerd, wordt de gebruiker eerst gevraagd de publieke sleutel in PEM-formaat in te voeren. Dit is de publieke sleutel die door de tweede partij is verzonden. Vervolgens wordt de leesbare tekst via het toetsenbord ingevoerd en wordt een AES-256-sleutel van 32 bytes gegenereerd. De leesbare tekst wordt versleuteld met de AES-256-codering. Daarna wordt de AES-256-sleutel met RSA versleuteld. De versleutelde ciphertext en de versleutelde AES-256-sleutel worden op het scherm weergegeven, zodat ze later indien nodig kunnen worden gekopieerd en geplakt.
 

Wanneer optie R wordt geselecteerd, wordt de gebruiker gevraagd de private sleutel en de versleutelde AES-256-sleutel in te voeren. De AES-sleutel wordt ontsleuteld met de private sleutel. Daarna wordt de ciphertext ontsleuteld met de AES-256-codering en de ontsleutelde sleutel. De resulterende leesbare tekst wordt op het scherm weergegeven.
 

Belangrijke uitvoer van het programma wordt weergegeven met rood gekleurde koppen, zodat deze eenvoudig herkenbaar zijn.
 

Tot slot beëindigt het selecteren van X het programma.
 

Figuur 1 tot Figuur 3 tonen voorbeelduitvoeringen van het programma met verschillende opties.

Example program: Secure Communication with RSA and AES
Figuur 1. Voorbeeld van programma-uitvoering 1. Figuur 2. Voorbeeld van programma-uitvoering 2. Figuur 3. Voorbeeld van programma-uitvoering 3.

Case study: veilig en geheim communiceren

In deze case study gaan we ervan uit dat Mary een veilige en geheime boodschap naar John wil sturen. Verder gaan we ervan uit dat zij beiden een Raspberry Pi 5 hebben en het programma RSASendReceive.py (Listing 1) hebben geladen. De procedure is als volgt:

 

• John maakt een public/private-sleutelpaar aan door optie G in het programma te selecteren (Figuur 4) en stuurt zijn publieke sleutel naar Mary, bijvoorbeeld via e-mail of een andere beschikbare communicatiemethode.

John creates a public/private key pair. Secure Communication with RSA and AES
Figuur 4. John maakt een public/private-sleutelpaar aan.

• Mary selecteert optie P, schrijft haar geheime bericht als leesbare tekst, genereert ciphertext met AES-256, genereert een versleutelde AES-256-sleutel en een met RSA versleutelde AES-sleutel (Figuur 5). Mary kan vooraf met John afspreken om bijvoorbeeld de datum en/of tijd (of een teller) aan het begin van haar leesbare tekst toe te voegen, zodat John weet dat het bericht van haar afkomstig is.

Mary writes her secret message. Secure Communication with RSA and AES
Figuur 5. Mary schrijft haar geheime bericht.

• Mary verstuurt de ciphertext en de versleutelde AES-256-sleutel naar John, bijvoorbeeld via e-mail of een andere communicatiemethode.

• John selecteert optie R om de AES-256-sleutel te ontsleutelen en vervolgens de ciphertext te ontsleutelen om de leesbare tekst te verkrijgen (Figuur 6).

John produces the plaintext.
Figuur 6. John genereert de leesbare tekst.

Dit artikel heeft laten zien hoe veilige communicatie in de praktijk kan worden geïmplementeerd met een combinatie van asymmetrische en symmetrische cryptografie. Door RSA te gebruiken voor sleuteluitwisseling en AES-256 voor gegevensversleuteling kan een betrouwbare en efficiënte methode worden gerealiseerd om vertrouwelijke informatie tussen embedded apparaten over te dragen. De Raspberry-Pi-5-implementatie laat zien dat zelfs relatief eenvoudige systemen moderne cryptografische technieken kunnen ondersteunen met eenvoudige software. Hoewel het voorbeeld voor de eenvoud AES in ECB-modus en RSA-1024 gebruikt, kan dezelfde aanpak worden uitgebreid naar veiligere configuraties, zoals AES-GCM en grotere sleutellengtes, waardoor deze geschikt is voor een breed scala aan embedded- en IoT-toepassingen.


Vragen of opmerkingen?

 

Heeft u vragen of opmerkingen over dit artikel? Stuur een e-mail naar de auteurs via d.ibrahim@btinternet.com of neem contact op met de redactie van Elektor via redactie@elektor.com.


Noot van de redactie: Dit artikel (260216-01) is een uittreksel uit het boek, Practical Microcontroller Cryptography (Elektor, 2026). Het is opgemaakt en licht bewerkt om aan te sluiten bij de huisstijl en paginalay-out van Elektor.

Inschrijven
Tagmelding: Abonneer u op de tag Cryptografie en u ontvangt een e-mail zodra er een nieuw item hierover op onze website wordt gepubliceerd!