Beschreibung
Für die sichere Übertragung von Daten kann es notwendig sein, diese zu verschlüsseln. Ein Beispiel hierfür ist die symmetrische Verschlüsselung von Daten mit demselben Schlüssel bei Sender
und Empfänger. Derartige Schlüssel sollten auf (echten) Zufallszahlen basieren. Unter Linux können solche Zufallszahlen recht einfach mittels /dev/urandom erzeugt werden:
user@domain:~> od -A n -t x -N 4 /dev/urandom
Je nach Umfang und Anzahl der Schlüssel kann die manuelle Erzeugung sehr aufwändig sein. Das Bash-Skript
generate_keys erzeugt daher Tabellen von Schlüsseln mit beliebiger Länge, die
direkt in einem C- oder C++-Programm verwendet werden können.
Quellen
Installation
Eine Installation ist nicht notwendig. Das Skript ist in ein beliebiges Verzeichnis zu kopieren und ausführbar zu machen:
user@domain:~> chmod u+x ./generate_keys
Beispiel
Das Skript ist ohne Optionen aufzurufen:
user@domain:~> ./generate_keys
Nach dem Aufruf fragt es nach der Anzahl der zu erzeugenden Schlüssel und erzeugt daraufhin eine Tabelle mit der entsprechenden Zahl an Schlüsseln:
Number of keys (each key is 32 Bit long):16
Don't forget to include /!
#define NUMBER_OF_SYM_KEYS 16 //!< specifies the number of keys in this list
const uint32_t sym_key_tab[NUMBER_OF_SYM_KEYS] PROGMEM = {
0xf8ef722f, //!< KEY0 --> to be adapted for each device separately!
0xd18ea6bb, //!< KEY1 --> to be adapted for each device separately!
0x5356ae45, //!< KEY2 --> to be adapted for each device separately!
0x9e13fa7f, //!< KEY3 --> to be adapted for each device separately!
0xca12c060, //!< KEY4 --> to be adapted for each device separately!
0x9871b7a9, //!< KEY5 --> to be adapted for each device separately!
0x605c3383, //!< KEY6 --> to be adapted for each device separately!
0x95d7de38, //!< KEY7 --> to be adapted for each device separately!
0x38d66c47, //!< KEY8 --> to be adapted for each device separately!
0x3953af86, //!< KEY9 --> to be adapted for each device separately!
0x376e4dfa, //!< KEY10 --> to be adapted for each device separately!
0x3a16c1f2, //!< KEY11 --> to be adapted for each device separately!
0x85885142, //!< KEY12 --> to be adapted for each device separately!
0x6c8c3d0e, //!< KEY13 --> to be adapted for each device separately!
0xc0929c40, //!< KEY14 --> to be adapted for each device separately!
0xe2dccf90 //!< KEY15 --> to be adapted for each device separately!
};
Diese Tabelle kann nun direkt im Code als Schlüssel-Tabelle verwendet werden. Das Schlüsselwort "PROGMEM" ist nur für den ATmega relevant, um die Tabelle im Flash-Speicher
abzuspeichern. Bei Verwendung anderer Controller (beispielsweise STM32Fxxx) kann "PROGMEM" einfach entfernt werden.
Fehlerquellen
Folgende Punkte sind bei der Erstellung Schlüsseln aus diesen Tabellen zu beachten:
- Bei symmetrischer Verschlüsselung sollten die Schlüssel natürlich geheim bleiben.
- Je nach Verschlüsselungsverfahren und Art der zu verschlüsselnden Daten können bekannte oder häufige Muster oder Werte dazu führen, dass im verschlüsselten Output eben diese Muster wieder zu erkennen sind.
Daher empfiehlt sich die Verwendung von Verfahren, die die vorangegangenen Daten für die Verschlüsselung der aktuellen Blöcke einbeziehen (cipher block chaining).
Lizenz
Alle hier veröffentlichten Quellen stehen unter der
GPLv3.
Versionsinfo
- Version 0.1, 29.03.2019: erste Veröffentlichung
Anregungen oder weitere Informationen
Hier kann ein Kommentar hinterlassen werden: