Skip to content
Snippets Groups Projects
Select Git revision
  • 04c9bef69f07f537f5a69f8965806aa46f6dce80
  • master default protected
  • dev_csx
3 results

README.md

Blame
  • Anian Bühler's avatar
    Anian Bühler authored
    fa8880b8
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.

    DidacticEncryption

    Bibliothek zur Implementierung von vereinfachten Verschlüsselungen auf Arduino-Boards. Die Funktionalitaeten entsprechen dem Stand der Technik, die Umsetzung ist didaktisch reduziert.

    Download

    Start download with the button on the right side. Choose the right format and start the download.

    After download install library: https://www.arduino.cc/en/guide/libraries section "Importing a .zip Library"

    Symetrische Verschluesselung (XOR)

    Diese KLasse ermöglicht eine einfache symmetrische Verschlüsselung auf einem Arduino-Board mit 8-Bit-µController, wie z.B. dem Arduino Uno. Der Algorithmus nutzt eine Exklusiv-Oder-Verknüpfung als Verschlüsselung. Es wird immer ein Zeichen der Nutzdaten mit einem Zeichen des Schlüssels verknüpft. Der Algortihmus ist für den ASCII-Zeichensatz geeignet.

    • XOR Verknüpfung von Nachricht und Schlüssel
    • "Endlos-Verknüpfung" (Datenlaenge != Schluessellaenge)
    • Für 7-Bit ASCII-Code geeignet

    Beispiele

    • symetric_minimal_.ino

    Funktionen und Parameter

    #Anlegen der Instanz
    // Anlegen des DidacticEncSymetric-Objekts
    // symEncrypt -> moeglicher Name für Objekt
    DidacticEncSymetric symEncrypt;
    
    #Setzen des Schluessels für die symetrische Verschluesselung
    int  symEncrypt.setKey(char*);
    // param1: Schluessel-string (char-Array mit '\0' am Ende) mit der Laenge LENGHT_KEY (default 8) + 1
    // return: ERROR-Wert: DE_ERROR_NO_ERROR, 
    //                     DE_ERROR_KEYLENGHT_LONG  -> Key zu lang
    //                     DE_ERROR_KEYLENGHT_SHORT -> Key zu kurz
    
    #Symetrisch ver- und entschluesseln
    void symEncrypt.crypt(char* messageIn, char* messageOut);
    // param1: Eingehende Nachricht (Lesbarer Text oder verschluesselter Text)
    // param2: Ausgehende Nachricht (Verschluesselter Text oder lesbarer Text)
    //-> verwendet internen Key, welcher über setKey(char*) gesetzt wurde
    
    void symEncrypt.crypt(char* messageIn, char* messageOut, char* key);
    // param3: Key-string (char-Array mit '\0' am Ende)
    // -> ignoriert internen Key - sinvoll wenn verschiedene Keys in einem Programm verwendet werden sollen.
    
    void symEncrypt.crypt(char* messageIn,  int lenghtMessageIn, char* messageOut,  int lenghtMessageOur, char* key);
    // param2 + param 4: Laenge der uebergebenen Nachrichten -> verwenden wenn kein ’\0' am Ende steht

    Konstanten

    Konstanten aus der Library die fuer die Programmierung genutzt werden und angepasst werden koennen.

    #Laenge Key und Daten
    DE_LENGHT_KEY	    default: 8
    MAX_LEN_CYPHERTEXT	default: DE_LENGHT_KEY*4
    MAX_LEN_PLAINTEXT	default: DE_LENGHT_KEY*4
    
    #Errors (nicht veraendern!)
    DE_ERROR_NOERROR          1
    DE_ERROR_KEYLENGHT_LONG  -1
    DE_ERROR_KEYLENGHT_SHORT -2

    Asymetrische Verschluesselung (angelehnt an RSA)

    Diese Klasse ermöglicht eine asymmetrische Verschlüsselung auf einem Arduino-Board mit 8-Bit-µController, wie z.B. dem Arduino Uno. Der RSA-Algorithmus ist maximal reduziert umgesetzt. Um die Laufzeit zu reduzieren, wird auf die Erzeugung von Primzahlen verzichtet. Auch werden (für Verschlüsselungsalgorithmen) extrem kleine Primzahlen verwendet. Weiter werden nur einzelne Bytes verschlüsselt und nicht die sonst übliche Kombination mehrerer. So kann auf zusätzliche Bibliotheken für große Zahlen verzichtet werden. Der Algortihmus ist (nur) für den ASCII-Zeichensatz geeignet.

    • RSA ohne gängige zusätzliche Sicherheitsfeatures
    • Keine Primzahlgenerierung
    • Nur für Werte bis 127 geeignet -> 7-Bit ASCII-Code
    • Verschlüsselte Daten werden als long-Zahlen in ASCII-Darstellung ausgegeben bzw. eingelesen

    Beispiele

    • asymetric_minimal_.ino

    Funktionen und Parameter

    #Anlegen der Instanz
    // Anlegen des DidacticEncAsymetric-Objekts
    // asymEncrypt -> moeglicher Name für Objekt
    DidacticEncAsymetric asymEncrypt;
    
    #Schlüssel erzeugen und verwenden
    void asymEncrypt.generateKeys();
    //erzeugt Private-Key, Public-Key und RSA-Modul
    
    long asymEncrypt.getPrivateKey();
    // return: Private-Key
    
    long asymEncrypt.getPublicKey();
    // return: Private-Key
    
    long asymEncrypt.getRsaModule();
    // return: RSA-Modul (zur Verschluesselung in Kombination entweder mit Public- oder Private-Key)
    
    
    #Asymetrisch verschluesseln
    int asymEncrypt.encrypt(char* plainText, char* cypherText, long key, long rsaModule);
    // param1: Eingehende Nachricht (Lesbarer Text)
    // param2: Ausgehende Nachricht (Verschluesselter Text)
    // param3: Key zum Verschluesseln der Nachricht
    // param4: RSA-Modul zum Verschluesseln der Nachricht
    // return: Lange der verschluesselten Nachricht (Anzahl Zeichen -> in ASCII-Zeichen gewandelte long-Werte )
    
    int asymEncrypt.encrypt(char* plainText, int lengthOfPlainText, char* cypherText, long key, long rsaModule);
    // param2: Laenge der eingehenden Nachricht -> verwenden wenn kein '\0' am Ende steht
    
    #Asymetrisch entschluesseln
    int asymEncrypt.decrypt(char* cypherText, char* plainText, long key, long rsaModule);
    // param1: Eingehende Nachricht (verschluesselter Text)
    // param2: Ausgehende Nachricht (lesbarer Text)
    // param3: Key zum entschluesseln der Nachricht
    // param4: RSA-Modul zum entschluesseln der Nachricht
    // return: Laenge der entschluesselten Nachricht (Anzahl Zeichen)
    
    void asymEncrypt.setRandomSeedPin(int);
    // param1: unbenutzter Analog-Pin A0 bis A5 zur Erzeugung von (quasi-) zufaelligen Zahlen

    Konstanten

    Konstanten aus der Library die fuer die Programmierung genutzt werden und angepasst werden koennen.

    #ASCII Trennzeichen zwischen Cypher-Werten
    CYPHER_SEPARATOR   default:";"
    
    #Maximale Laenge der verschluesselten Nachricht
    MAX_LEN_CYPHERTEXT default: 250
    
    #Primes 
    MAX_NR_OF_PRIMES    48  (nicht veraendern)
    MAX_PRIME_OFFSET    3