Blockwoche Informationssicherheit: Übung 15

Für dieses Übungsblatt benötigt ihr das in StudIP zur Verfügung
gestellte Archiv ueb15-vorgabe.zip mit Vorgabedateien.


Aufgabe 1, 8 Punkte, Gruppe

Implementiert in der Datei myccm.cc die Methoden MyCCM::encrypt
und MyCCM::decrypt zur Verschlüsselung sowie Entschlüsselung und
Integritätsprüfung gemäß RFC 3610
(„Counter with CBC-MAC (CCM)“). In den Vorgabedateien findet Ihr
ein Programmgerüst, das sich bereits um vieles kümmert, so dass Ihr
Euch auf die beiden genannten Funktionen beschränken könnt.

Lest als erstes die Datei README.md aus der Vorgabe durch. Dort
erfahrt Ihr, wie das Programm übersetzt wird und welche Argumente beim
Aufruf auf der Kommandozeile akzeptiert werden. Im einfachsten Fall
benötigt Ihr nur den Schlüssel:

  • myccm -e schlüssel < klartext > geheimtext
  • myccm -d schlüssel < geheimtext > klartext

(Natürlich würde man in einem realen System den Schlüssel nicht
über die Kommandozeile übergeben, da dieser dann leicht einsehbar ist;
allerdings ist die vorgeschlagene Vorgehensweise erst einmal
einfacher. Analog könnt Ihr Nonces als Argumente an das Kommando
übergeben oder — etwas sinnwidrig — einfach festschreiben,
insbesondere um Tests untereinander zu vereinfachen.)

Wir verwenden C++, damit Ihr möglichst wenig mit Pointer-Arithmetik
hantieren müsst. Insbesondere die Mechanismen für null-terminierte
Zeichenketten (z. B. strlen in C) eignen sich nicht für diese
Aufgabe, da sowohl die Eingabe- und Ausgabedaten, aber auch Nonces
oder Schlüssel ja Nullbytes enthalten können! In C++ muss für
std::string oder die Stream-basierte Eingabe/Ausgabe darauf geachtet
werden, dass immer mit einer expliziten Längenangabe gearbeitet wird,
da ein enthaltenes Nullbyte ansonsten auch als terminierendes Zeichen
interpretiert wird.

Euer fertiges Programm muss für uns zumindest auf den x-Rechnern im
Rechnerpool der Ebene 0 übersetzbar und ausführbar sein. Makefile und
andere zum Zusammenbauen erforderliche Dateien (z. B. für
Unit-Testing) liefert Ihr bitte mit. (Und die Beschreibung, was Ihr
gemacht habt, in der Markdown-Doku nicht vergessen…)

Kryptographische Operationen müssen in konstanter Zeit ausgeführt
werden, um Seitenkanalangriffe zu vermeiden, die Informationen aus
unterschiedlichen Ausführungszeiten ableiten. Berücksichtigt dies
insbesondere für den Integritätscheck, da zum Beispiel der auf der
Klasse string definierte Vergleichsoperator bei der ersten
Abweichung zwischen den Argumenten abbricht. Und vergesst nicht, das
Ergebnis des Integritätschecks
als Ergebnis der Methode
MyCCM::decrypt zurückzugeben!

Nutzt während der Implementierung auch die schon kennengelernten
Werkzeuge, insbesondere den Static Analyzer und den Address Sanitizer,
um Euch das Programmieren und die Fehlersuche zu erleichtern. An
welcher Stelle haben diese Tools Euch geholfen?

Bitte testet Eure Implementierungen mit den mitgelieferten
Testvektoren (-T testvectors) und untereinander, um deren
Korrektheit zu überprüfen bzw. Fehlern auf die Schliche zu
kommen. Gebt die Gruppen an, mit denen Ihr Euch ausgetauscht
habt. Zieht dabei selbst eine sinnvolle Grenze zwischen „darüber
reden“ und „sich gegenseitig den Quellcode zuschicken“. Wir möchten,
dass Ihr etwas lernt, aber die Punkte, die wir vergeben, sollen Euch
wirklich zustehen.

Zum Testen der korrekten Funktionalität enthält die Vorgabe
Testvektoren. Diese Testvektoren nutzen verschiedene Werte für die
Parameter M und L sowie verschiedene Schlüssel und Nonces.

Die Referenzdokumentation für das vorgegebene Gerüst findet Ihr in der
Vorgabe im Verzeichnis doc (einmal als PDF-Dokument refman.pdf und
in der HTML-Version mit html/index.html als Einstiegspunkt). Die
HTML-Dokumentation findet Ihr zudem unter
https://rangpur.informatik.uni-bremen.de/ccm/.


Abgabe

bis 2025-02-13 23:59 UTC, digital in Stud.IP als zip-Archiv mit einer
Markdown-Datei, einem gerenderten PDF dieser Markdown-Datei und allen
Dateien, die die Markdown-Datei zum Rendern braucht. Als Dateinamen
verwendet Ihr isec24_ueb15_grpYY.(md|pdf|zip) (Das YY mit Eurer
Gruppennummer ersetzen). Dabei bitte in der Datei alle
Gruppenmitglieder namentlich nennen. Ebenso die Nummer Eurer Gruppe in
Stud.IP.

Bitte steckt die Energie ins Denken und Schreiben, nicht in eine
wunderschöne Formatierung — lesbar darf es allerdings sein. Die
Lösungswege sollten ggf. nachvollziehbar sein.

Wenn Ihr Euch irgendwelcher Quellen aus dem Netz bedient (Anleitungen,
HowTos, etc.), gebt diese bitte als URI mit an.

*Carsten Bormann, Karsten Sohr, Stefanie Gerdes, Jan-Frederik
Rieckers, Finn Ewers, Andreas Benischke ·

ccm-0.pdf