Kryptographie mit C# – Teil 2

Beschäftigten wir uns im ersten Teil noch mit dem Ver- und Entschlüsseln von Zeichenketten, wenden wir uns nun den Dateien zu, um dann im Anschluss Hashwerte zu berechnen. Dazu wird das gleiche Projekt wie aus Teil 1 benötigt, ebenso wie das Grundlagenwissen.

Datei verschlüsseln

Als Erstes legen wir mit dem Editor eine Textdatei an. In diese schreiben wir einen beliebigen Text und speichern ab.Dann wenden wir uns unserem Projekt zu. Sollte ein WPF-Projekt verwendet werden, muss zuvor

1
<span style="color: #3366ff;">using Microsoft.Win32</span>

hinzugefügt werden.

Der erste Codeblock ist bereits bekannt. Und auch der Umgang mit dem OpenFileDialog sowie dem try-catch-Block sollte nicht fremd sein. Interessant wird es an dieser Stelle:

Die erste Zeile sorgt dafür, dass die verschlüsselte Datei eine andere Endung besitzt (in diesem Fall .crypt). Dann erstellen wir jeweils eine Instanz für den Inputstream, den Outputstream und den Cryptostream. Dieses Vorgehen sollte noch aus Teil 1 bekannt sein.

Die while-Schleife liest schließlich den Inputstream Byte für Byte aus und schreibt die Daten in den Cryptostream, der die nun verschlüsselten Bytes an den Outputstream weiterleitet.

Wie man unschwer erkennen kann, ist die Handhabung nicht schwieriger als das Verschlüsseln von Zeichenketten.

Datei entschlüsseln

Mit diesem Wissen ist nun ein leichtes, die Datei wieder zu entschlüsseln:

Zu beachten ist, dass jede Datei die Endung .txt besitzen wird. Das heißt, dass die Originaldatei, sofern sie sich im gleichen Pfad befindet wie die verschlüsselte Datei, ersetzt wird. Natürlich kann man jede beliebige Datei ver- und entschlüsseln. Auf die Dateiendung kommt es letztendlich nicht an.

Hashwert berechnen

Wenig spektakulär ist dagegen die Berechnung des Hashwertes, denn fast alle Codezeilen sind bereits bekannt:

Nur der Bitconverter stellt eine Ausnahme dar, den wir uns kurz näher betrachten wollen. Mit dieser Klasse ist es möglich, Objekte zu Bytes (und wieder zurück) zu serialisieren. Zunächst speichern wir den berechneten Hashwert in ein Byte-Array, das 16 Bytes lang ist:

1
<span style="color: #3366ff;">hash = [142, 84, 34, 80, 41, 164, 74, 182, 239, 31, 222, 9, 104, 111, 236, 123]</span>

Die Aufgabe des Bitconverters ist nun, aus diesen Bytes ein Objekt zu erstellen. In unserem Fall bedeutet das die Umwandlung in eine Zeichenkette (Methode

1
<span style="color: #3366ff;">.ToString()</span>

).

Verdeutlichen möchte ich das, indem wir eine Datei hashen, deren Hashwert öffentlich bekannt ist. Als Beispiel muss der freie Grafikeditor Gimp herhalten. Sein MD5-Hashwert steht auf der Internetseite des Herstellers und lautet in der vorliegenden Dateiversion „gimp-2.8.22-setup.exe“:

Bildquelle: https://www.gimp.org/downloads/

Die Zahlenwerte oben sind nicht zufällig gewählt. Diese erhält man nämlich, wenn wir zu der Datei einen Hashwert berechnen lassen. Der Bitconverter wird nun jede Dezimalzahl in eine hexadezimale Zahl umwandeln. Aus 142 wird demnach 8e, aus 84 nunmehr 54, usw.

Wir werden feststellen, dass die beiden Zeichenketten gleich sind. Daraus lässt sich schließen, dass es sich um das unveränderte Original handelt.

Welche Verfahren sollte man nutzen?

Microsoft stellt eine Reihe von Algorithmen zur Verfügung. Einige sind up to date, andere jedoch hoffnungslos veraltet bzw. schon gebrochen.

Demnach gibt es keinen Grund heutzutage noch DES oder TripleDES einzusetzen. Der Erste ist bereits nach einigen Stunden geknackt.

Anders sieht es beim AES (=Rijndael) aus, der zum Beispiel in den USA für Dokumente mit höchster Geheimhaltungsstufe zugelassen ist.

Bei den Hashfunktionen sollte dringend von MD5 und SHA1 Abstand gehalten werden. Bei beiden sind provozierte Kollisionen, das heißt, ein Hashwert für mehrere Dokumente/Texte, bekannt. Bedenkenlos zugreifen kann man derzeit noch auf alle SHA2-Verfahren (SHA256, SHA384 und SHA512). Auch RIPEMD-160 kann noch verwendet werden.

Hinweis zur Sicherheit

Man sollte stets beachten, dass es keine absolute Sicherheit gibt. Linux mag quelloffen sein, dennoch werden täglich Sicherheitslücken aufgedeckt. Windows besitzt diese ebenfalls und geht sogar noch einen Schritt weiter, indem es die Einsicht in den Quellcode verweigert. Genau das Gleiche ist bei den verwendeten Bibliotheken (alles was unter

1
<span style="color: #3366ff;">using</span>

steht) zu beachten.

Schlusswort

Wie wir sehen konnten, ist Kryptographie mit C# kein Buch mit sieben Siegeln. Mit relativ einfachen Befehlen und kurzen Methoden sind wir in der Lage Zeichenketten, als auch Dateien, zu ver- und entschlüsseln. Was wir nicht behandelt haben, sind die asymmetrischen Verfahren, wie zum Beispiel den RSA-Algorithmus.
RSA ist zwar vom Verständnis her einfach zu verstehen, hätte aber dennoch den Rahmen dieses Artikels gesprengt. Deshalb spare ich mir das Thema für einen weiteren Artikel auf, der mit Sicherheit im Laufe dieses Jahres folgen wird.

Für alle Interessierten hier noch der verwendete Quellcode zum Download:

SymmetrischeVerschlüsselung.zip (163 Downloads)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.