22 Aug 2014

AES-Verschlüsselung in CONZEPT 16

Autor: Giuliano (vectorsoft)
Kategorien: Neu vorgestellt, Programmierung

Neben den bereits angekündigten Signaturfunktionen (siehe Signieren mit CONZEPT 16), werden die Prozeduren um Ver- und Entschlüsselungsbefehle erweitert, die vor allem einen Austausch chiffrierter Daten mit anderen Applikationen ermöglichen. Dazu wird das symmetrische Kryptoverfahren AES (Advanced Encryption Standard) verwendet.

Bei symmetrischen Verfahren wird der selbe Schlüssel sowohl für die Verschlüsselung als auch für die Dechiffrierung verwendet. Bei AES handelt es sich um den Nachfolger von DES (Data Encryption Standard), wobei die Verarbeitung der Daten in Datenblöcken vorgenommen wird. Jeder Datenblock ist immer 128 Bit lang, größere Datenmengen werden in eine entsprechende Anzahl von Blöcken aufgeteilt. Sollte die Länge der Daten nicht genau 128 Bit oder ein Vielfaches davon betragen, findet eine Auffüllung durch das sogenannte PKCS#7-Padding statt.

Bei einem Block handelt es sich um ein zweidimensionales Byte-Array, das bei AES mit 4 Spalten und 4 Reihen definiert ist. Dementsprechend beträgt die Blockgröße 16 Byte = 128 Bit. Auf den Daten eines Blocks finden dann mehrere Runden (Wiederholungen) bestimmter Operationen unter Verwendung des Schlüssels statt, woraus sich zum Schluss der chiffrierte Block ergibt.

Die Länge des Schlüssels ist von der Blocklänge unabhängig und kann 128, 192 oder 256 Bit betragen. Die Bezeichnungen AES-128, AES-192 und AES-256 beziehen sich daher auf die Länge des verwendeten Schlüssels. Eine größere Schlüssellänge bedeutet dabei eine höhere Sicherheit der Daten, jedoch auch einen etwas höheren Rechenaufwand.

Bei der Blockverschlüsselung ist es wichtig, dass über das Chiffrat möglichst keine Rückschlüsse auf den Schlüssel gezogen werden können (Konfusion) und dass schon das Ändern eines winzigen Teils der zu verschlüsselnden Nachricht das gesamte Chiffrat auf unvorhersehbare Weise verändert (Diffusion). Zu diesem Zweck wird AES in Zusammenhang mit einem sogenannten Betriebsmodus verwendet, der definiert, wie größere Datenmengen mit mehreren Blöcken zu behandeln sind.

Aktuell stehen folgende Betriebsarten zur Verfügung:

  • Cipher-block chaining (CBC)
  • Output feedback (OFB)
  • Galois/Counter Mode (GCM)

Ein weiterer Sicherheitsfaktor ist der Initialisierungsvektor (IV). Der IV soll verhindern, dass das Chiffrat bei der Verwendung der selben Nachricht und dem selben Schlüssel immer gleich ist. Andernfalls wäre es möglich, durch Cryptoanalyse Rückschlüsse auf den verwendeten Schlüssel zu ziehen (beispielsweise das Erkennen von bestimmten Wortgruppen). Der IV wird zufällig generiert und sollte nicht mehrfach genutzt werden. Die Länge des IV ist identisch mit der verwendeten Blocklänge, also 128 Bit. Da der IV selbst zur Entschlüsselung nicht ausreicht, muss er nicht geheim sein.

Verschlüsseln

Die Funktion MemEncrypt() wird zum Verschlüsseln verwendet und ist wie folgt aufgebaut:

MemEncrypt(
      MemMsg        : handle; // Klartext / Chiffrat
      Options       : int;    // Optionen
      Key           : alpha;  // Schlüssel
      IV            : alpha;  // Initialisierungsvektor
  opt Pos           : int;    // Klartextposition
  opt Len           : int;    // Klartextlänge
  opt MemDst        : handle; // Chiffrat
  opt PosDst        : int;    // Chiffratposition
  opt MemKey        : handle; // Binär-Key
  opt MemIV         : handle; // Binär-IV
  opt MemTag        : handle; // GCM-Authentifikations-Tag
)
: int                         // Fehlerwert

Argumente
  • MemMsg

    In MemMsg wird ein Memory-Objekt übergeben, welches die Nachricht enthält, die verschlüsselt werden soll. Ist kein Ziel-Objekt in MemDst angegeben, wird MemMsg nach erfolgreicher Verschlüsselung mit dem Chiffrat überschrieben.

  • Options

    Der Parameter Options setzt sich aus folgenden 4 Bereichen zusammen: Verschlüsselungsalgorithmus, Betriebsmodus, Schlüssel-Kodierung und IV-Kodierung.

    Zu Beginn werden die Verschlüsselungsalgorithmen AES-128 (_MemCipherAES128), AES-192 (_MemCipherAES192) und AES-256 (_MemCipherAES256) bereitgestellt.

    Für die oben bereits genannten Modi stehen die Konstanten _MemCipherModeCBC, _MemCipherModeOFB und _MemCipherModeGCM zur Verfügung.

    Der Bereich Schlüssel-Kodierung gibt an, ob der Schlüssel in Key Hex- (_MemKeyHex) oder Base64-Kodiert (_MemKeyBase64) ist. Der Schlüssel kann auch binär vorliegen (_MemKeyMem). Wird diese Konstante angegeben, dann muss zusätzlich in MemKey ein Memory-Objekt, welches den Schlüssel enthält, übergeben werden.

    Für den Bereich IV-Kodierung gilt das gleiche wie für die Schlüssel-Kodierung. Hier wird die Kodierung des Initialisierungsvektors angegeben und es stehen die Konstanten _MemIVHex, _MemIVBase64 und _MemIVMem zur Verfügung. Bei _MemIVMem muss ein Memory-Objekt mit dem Initialisierungsvektor in MemIV übergeben.

  • Key / IV

    In Key und IV werden jeweils der Schlüssel und der Initialisierungsvektor übergeben. Bei der Verwendung von _MemKeyMem / _MemIVMem wird Key / IV nicht ausgewertet.

  • Pos / Len

    Mittels Pos und Len kann die Position und die Länge des Klartextes im Memory-Objekt angegeben werden.

  • MemDst / PosDst

    Falls in MemDst ein Memory-Objekt übergeben wird, beinhaltet es nach erfolgreicher Verschlüsselung das Chiffrat. Mit PosDst kann die Position angegeben werden, an der das Chiffrat in MemDst geschrieben wird.

  • MemKey / MemIV

    enthält den Schlüssel / Initialisierungsvektor und wird nur ausgewertet, wenn die Option _MemKeyMem / _MemIVMem gesetzt ist.

  • MemTag

    Hier muss ein Memory-Objekt angegeben werden, falls der GCM-Modus verwendet wird. Nach der Verschlüsselung enthält es ein Tag, welches der Authentifikation dient.

Entschlüsseln

Die Funktion zum Entschlüsseln ist MemDecrypt() und hat folgenden Aufbau:

MemDecrypt(
      MemChf        : handle; // Chiffrat / Klartext
      Options       : int;    // Optionen
      Key           : alpha;  // Schlüssel
      IV            : alpha;  // Initialisierungsvektor
  opt Pos           : int;    // Chiffratposition
  opt Len           : int;    // Chiffratlänge
  opt MemDst        : handle; // Klartext
  opt PosDst        : int;    // Klartextposition
  opt MemKey        : handle; // Binär-Key
  opt MemIV         : handle; // Binär-IV
  opt MemTag        : handle; // GCM-Authentifikations-Tag
)
: int                         // Fehlerwert

Der Köpfe der Funktionen MemEncrypt() und MemDecrypt() sind nahezu gleich. Die Funktionen unterscheiden sich lediglich darin, dass MemDecrypt() im ersten Argument (MemChf) ein Memory-Objekt erwartet wird, dass das zu entschlüsselnde Chiffrat enthält. Desweiteren wird im letzten Argument das Authentifikations-Tag angegeben welches durch MemEncrypt() zurückgegeben wurde.

Gefällt mir!
Weitere Artikel

Kommentare

4 Kommentare zu “AES-Verschlüsselung in CONZEPT 16”

  1. Das ist eine grossartige Erweiterung, denn damit wird es endlich möglich sein, symmetrische Verschlüsselungsverfahren in der Kommunikation mit anderen Applikationen zu verwenden. Mit den früher angebotenen Mitteln war dies nicht möglich, wie man hier: http://www.vectorsoft.de/Blog/2012/07/Verschluesselung-und-Komprimierung noch einmal nachlesen kann. Also ist dieses neue Feature eine sehr gute und wichtige Erweiterung. Vielen Dank! Einige Anmerkungen und Fragen: Die angebotenen Betriebsmodi sind nicht alle gleichbedeutend, auch wenn sie hier nebeneinander stehen. GCM ist ein Betriebsmodus für authentifizierte Verschlüsselung, d.h. symmetrische Verschlüsselung + Absicherung der Nachrichtenintegrität. Dieser Modus bietet also *mehr* als die anderen beiden Modi (durch die Sicherung der Narichtenintegrität ist dieser Modus viel sicherer als die anderen beiden, das könnte für den Anwender ja u. U. sehr wichtig sein). Neben OFB (den ich belang noch nicht kannte) gibt es m. E. einen anderen verbreiteten Modus, der hier gar nicht vertreten ist: CTR (counter mode: https://de.wikipedia.org/wiki/Counter_Mode). Soweit ich weiss, wird dieser Modus immer häufiger verwendet, da er einige Vorteile gegenüber CBC bietet. Daher wäre es m. E. interessant zu wissen, ob man eine im CTR-Modus verschlüsselte Nachricht mit den hier angebotenen Mitteln entschlüsseln könnte?

     

    Kilian

  2. @Kilian Wir werden CTR auch als Modus unterstützen. Es gibt ja noch eine Reihe weiterer Modi (z.B. ECB, XTS oder verschiedene CFB-Varianten), die weniger gebräuchlich sind, die wir aber im Bedarfsfall ebenfalls implementieren können.

     

    Andrej (vectorsoft)

  3. Danke für die Info. Eine weitere Frage, die für uns Anwender interessant sein könnte, ist: Wird es Beispiele für die neuen kryptographischen Funktionen MemSign, MemVerify, MemEncrypt, MemDecrypt und deren verschiedene Anwendungsfälle in der CodeLibrary geben?

     

    Kilian

  4. @Kilian Wir werden uns über passende Beispiele für die Codelibrary Gedanken machen.

     

    Andreas (vectorsoft)

Kommentar abgeben

Sie müssen angemeldet sein, um Kommentare abgeben zu können.

  • Navigation

    oder
  • Kategorien

  • Anmelden

    Registrieren

  • Links