C++ AES Implementation

12/14/2014 21:19 nico_w#1
Hey,

unter dem Projekt "FoxCrypt" möchte ich verschiedene Verschlüsselungs- und Hashalgorithmen als alleinstehende C++-Klassen implementieren und veröffentlichen.
Den Anfang mache ich hier mit AES, zu dem ich leider keine wirklich alleinstehende Klasse für C++ finden konnte.
Meine AES-Klasse implementiert lediglich blockweise-Verschlüsselung, die anderen Modes (CBC, CFB, CTR, OFB etc.) folgen später. Das ganze ist natürlich noch etwas optimierungswürdig und unterstützt z.B. noch kein AES-NI, aber auch darum möchte ich mich später noch kümmern. Primärziel war hier für mich erst mal, eine übersichtliche und leicht anpassbare AES-Implementation in C++ zu haben und die möchte ich auch mit euch teilen.

FoxAES.cpp: [Only registered and activated users can see links. Click Here To Register...]
FoxAES.h: [Only registered and activated users can see links. Click Here To Register...]

GitHub Repository: [Only registered and activated users can see links. Click Here To Register...]

Die Verwendung ist sehr einfach, hier mal Beispielcode aus meiner Testanwendung:
Code:
FoxCrypt::AES ctx;
ctx.SetEncryptionKey(aesKey, FoxCrypt::AES_128);

for (uint32_t i = 0; i < blockCount; i++) {
	memcpy(decBlock, buffer, 16);
	ctx.EncryptBlock(decBlock, encBlock);
	memcpy(buffer, encBlock, 16);

	buffer += 16;
}

ctx.SetDecryptionKey(aesKey, FoxCrypt::AES_128);

for (uint32_t i = 0; i < blockCount; i++) {
	memcpy(encBlock, buffer, 16);
	ctx.DecryptBlock(encBlock, decBlock);
	memcpy(buffer, decBlock, 16);

	buffer += 16;
}
Gruß, Nico
12/14/2014 22:06 snow#2
#moved

Schau mal noch bei Jabber rein, ist ja grauenhaft, dass du jeden Schritt da komplett hingeschrieben hast, ist das Premature Optimization oder was? :p
12/14/2014 22:22 nico_w#3
Quote:
Originally Posted by snow View Post
#moved

Schau mal noch bei Jabber rein, ist ja grauenhaft, dass du jeden Schritt da komplett hingeschrieben hast, ist das Premature Optimization oder was? :p
Das hat nur den Grund, dass ich es an eine bestehende Implementation anpassen wollte (die ich leider nur als Binary hab).
Wird später alles noch ausgebessert. :D
12/19/2014 21:06 Mashkin#4
Die Korrektheit kann ich nicht vollständig bewerten - dafür gibt es Testvektoren.

Die Runden sollten als Schleife ausgeführt werden, die einzige "Komplexität" ist hier der Erhalt der vorherigen Zustandsmatrix für den ShiftRows-Schritt.
Was mich stört ist die Verwendung von Lookup-Tabellen für MixColumn.
Die ist für eine operationssparsame Implementierung durchaus sehr angebracht (auf Kosten des höheren Speicherbedarfs), allerdings fände ich zum besseren Verständnis eine (ausgelagerte) Berechnungsvorschrift für die Tabellen sinnvoll.

Auch der Key Schedule könnte statt im Voraus bei Bedarf zwischen den Runden abgearbeitet werden - zumindest bei der Verschlüsselung.

Ich frage mich aber für welchen Anwendungsfall dein Projekt FoxCrypt Vorteile gegenüber existierenden Bibliotheken wie Crypto++ bringt.
Crypto++ im speziellen besteht zwar aus umfangreicherem Code, bietet aber bereits eine Vielzahl an Algorithmen, Hilfsfunktionen (z.B. Operationen in GF(2^8) die für AES ohne Lookup-Tabellen nötig sind) und - besonders bei AES - Hardwarebeschleunigung und funktioniert zudem plattformübergreifend.
12/19/2014 21:54 snow#5
Diese Version ist für einen bestimmten Zweck angepasst, deshalb sieht die auch ein wenig chaotisch aus. Zumindest war das mein letzter Stand. :o

Es sollte jedem natürlich klar sein, dass man keinesfalls eine eigene Implementierung eines Verschlüsselungsalgorithmus verwenden sollte, solange es keinen verdammt guten Grund dafür gibt.