Übersicht über Kryptographie

Die Kryptographie trägt zum Schutz von Daten vor Lese- oder Änderungsvorgängen bei und bietet sichere Kommunikation über ansonsten unsichere Kanäle. So können Daten beispielsweise mit Hilfe eines kryptographischen Algorithmus verschlüsselt, im verschlüsselten Zustand übertragen und später beim vorgesehenen Empfänger wieder entschlüsselt werden. Wenn ein Dritter die verschlüsselten Daten abfängt, sind diese schwer zu entziffern.

Eine typische Situation für den Einsatz von Kryptographie ist die Kommunikation zwischen zwei Teilnehmern (Alice und Bob) über einen unsicheren Kanal. Alice und Bob möchten sicherstellen, dass ihre Kommunikation bei eventuellen Abhörversuchen unverständlich bleibt. Da sich Alice und Bob an Remotestellen befinden, muss außerdem gewährleistet sein, dass die Informationen, die Alice von Bob empfängt, während der Übertragung nicht geändert wurden. Alice muss außerdem sicher sein, dass die Informationen tatsächlich von Bob stammen und nicht von jemandem, der Bobs Identität angenommen hat.

Die Kryptographie wird für folgende Zielsetzungen verwendet:

  • Vertraulichkeit: Die Identität des Benutzers soll geschützt oder das Lesen von Daten verhindert werden.
  • Datenintegrität: Die Daten sollen vor Änderungen geschützt werden.
  • Authentifizierung: Es soll sichergestellt werden, dass Daten von einem bestimmten Teilnehmer stammen.

Um diese Ziele zu erreichen, können Sie aus einer Kombination von Algorithmen und Vorgehensweisen, die als kryptographische Grundelemente bezeichnet werden, ein kryptographisches Schema erstellen. In der nachstehenden Tabelle sind die kryptographischen Grundelemente und deren Verwendungszweck aufgeführt.

Kryptographisches Grundelement Verwendung
Verschlüsselung mit geheimem Schlüssel (symmetrische Kryptographie) Transformiert die Daten und verhindert, dass sie von Dritten gelesen werden. Bei diesem Verschlüsselungstyp werden die Daten mit einem einzigen, gemeinsam genutzten, geheimen Schlüssel ver- und entschlüsselt.
Verschlüsselung mit öffentlichem Schlüssel (asymmetrische Kryptographie) Transformiert die Daten und verhindert, dass sie von Dritten gelesen werden. Bei diesem Verschlüsselungstyp werden die Daten mit einem Paar aus öffentlichem und privatem Schlüssel ver- und entschlüsselt.
Kryptographische Signatur Stellt sicher, dass die Daten von einem bestimmten Teilnehmer stammen. Dazu wird eine digitale Signatur erstellt, die diesen Teilnehmer eindeutig bezeichnet. Bei diesem Prozess werden auch Hashfunktionen verwendet.
Kryptographische Hashs Ordnet Daten beliebiger Länge einer Bytesequenz fester Länge zu. Hashs sind statistisch eindeutig; eine unterschiedliche 2-Byte-Sequenz erzielt nicht denselben Hashwert.

Verschlüsselung mit geheimem Schlüssel

Bei Verschlüsselungsalgorithmen mit geheimem Schlüssel werden die Daten mit einem einzigen geheimen Schlüssel ver- und entschlüsselt. Der Schlüssel muss vor dem Zugriff Unbefugter geschützt werden, da jeder, der im Besitz des Schlüssels ist, die Daten entschlüsseln kann. Die Verschlüsselung mit geheimem Schlüssel wird auch als symmetrische Verschlüsselung bezeichnet, da für das Ver- und Entschlüsseln derselbe Schlüssel verwendet wird. Die Verschlüsselungsalgorithmen mit geheimem Schlüssel sind im Vergleich zu den Algorithmen mit öffentlichem Schlüssel außergewöhnlich schnell und gut für die kryptographische Transformation großer Datenstreams geeignet.

In der Regel werden Algorithmen mit geheimem Schlüssel, so genannte Blockverschlüsselungsalgorithmen, zum Verschlüsseln von jeweils einem Datenblock verwendet. Blockverschlüsselungsalgorithmen (wie RC2, DES, TripleDES und Rijndael) transformieren kryptographisch einen Eingabeblock mit n Bytes in einen Ausgabeblock mit verschlüsselten Bytes. Wenn eine Bytesequenz ver- oder entschlüsselt werden soll, muss das blockweise geschehen. Da n klein ist (n = 8 Bytes bei RC2, DES und TripleDES; n = 16 [Standard], n = 24 oder n = 32 Bytes bei Rijndael), müssen Werte, die größer sind als n, jeweils blockweise verschlüsselt werden.

Für die Blockverschlüsselungsklassen in der Basisklassenbibliothek wird ein Verkettungsmodus mit der Bezeichnung Cipher Block Chaining (CBC) verwendet, der für die kryptographische Datentransformation einen Schlüssel und einen Initialisierungsvektor (IV) verwendet. Bei einem geheimen Schlüssel k wird ein Eingabeblock mit Klartext mit Hilfe einer einfachen Blockverschlüsselung ohne Initialisierungsvektor in denselben Ausgabeblock mit verschlüsseltem Text transformiert. Wenn der Klartextstream doppelte Blöcke enthält, befinden sich diese auch im verschlüsselten Textstream. Wenn ein Unbefugter etwas über die Struktur eines Klartextblocks weiß, kann er diese Informationen zum Entschlüsseln des bekannten verschlüsselten Blocks verwenden und möglicherweise den Schlüssel ermitteln. Um dieses Problem zu vermeiden, werden beim Verschlüsselungsprozess Informationen aus dem vorherigen Block unter den nächsten Block gemischt. Daher werden zwei identische Klartextblöcke unterschiedlich ausgegeben. Da bei dieser Technik jeweils der vorherige Block zum Verschlüsseln des nächsten Blocks verwendet wird, wird zum Verschlüsseln des ersten Datenblocks ein Initialisierungsvektor (IV) verwendet. Mit diesem System ist es nicht möglich, anhand häufig verwendeter Nachrichtenheader, die einem Unbefugten bekannt sein könnten, den Schlüssel zurückzuentwickeln.

Eine Möglichkeit, mit dieser Methode verschlüsselte Daten unbefugt zu entschlüsseln, ist das Ausprobieren jedes möglichen Schlüssels. Je nach Größe des verwendeten Schlüssels ist diese Suchmethode jedoch selbst mit dem schnellsten Rechner äußerst zeitaufwendig und daher nicht realisierbar. Größere Schlüssel sind schwieriger zu entschlüsseln. Obwohl mit dem Verschlüsseln das Lesen verschlüsselter Daten für Unbefugte theoretisch nicht völlig ausgeschlossen ist, treibt es doch den Kostenaufwand in die Höhe. Wenn es mit einer umfassenden Suche drei Monate dauert, Daten zu entziffern, die nur ein paar Tage lang von Bedeutung sind, ist diese Suchmethode unbrauchbar.

Der Nachteil der Verschlüsselung mit geheimem Schlüssel liegt darin, dass sich zwei Teilnehmer auf einen Schlüssel und einen Initialisierungsvektor geeinigt und die entsprechenden Werte ausgetauscht haben müssen. Der Schlüssel muss außerdem vor Unbefugten geheim gehalten werden. Aufgrund dieser Probleme wird die Verschlüsselung mit geheimem Schlüssel oft in Verbindung mit der Verschlüsselung mit öffentlichem Schlüssel eingesetzt, um die Werte von Schlüssel und IV vertraulich zu kommunizieren.

Wenn es sich bei Alice und Bob um zwei Teilnehmer handelt, die über einen unsicheren Kanal miteinander kommunizieren möchten, könnten sie die Verschlüsselung mit geheimem Schlüssel wie nachfolgend beschrieben vornehmen. Alice und Bob einigen sich darauf, einen bestimmten Algorithmus (z. B. Rijndael) mit einem bestimmten Schlüssel und IV zu verwenden. Alice verfasst eine Nachricht und erzeugt einen Netzwerkstream, über den die Nachricht gesendet werden soll. Als Nächstes verschlüsselt sie mit Hilfe des Schlüssels und des Initialisierungsvektors den Text und sendet ihn über das Internet. Schlüssel und IV werden nicht an Bob gesendet. Bob empfängt den verschlüsselten Text und entschlüsselt ihn mit dem zuvor vereinbarten Schlüssel und IV. Wenn die Übertragung abgefangen wird, kann der unbefugte Dritte die Originalnachricht nicht entschlüsseln, da er weder Schlüssel noch IV kennt. Bei diesem Szenario muss der Schlüssel geheim gehalten werden, nicht jedoch der IV. In der Realität würde entweder Alice oder Bob einen geheimen (symmetrischen) Schlüssel erzeugen und ihn mit Hilfe der asymmetrischen Verschlüsselung (mit öffentlichem Schlüssel) an die Gegenseite übertragen. Weitere Informationen finden Sie im Abschnitt über Verschlüsselung mit einem öffentlichen Schlüssel weiter hinten in diesem Thema.

.NET Framework stellt die folgenden Klassen bereit, durch die Verschlüsselungsalgorithmen mit geheimem Schlüssel implementiert werden:

Verschlüsselung mit öffentlichem Schlüssel

Bei der Verschlüsselung mit öffentlichem Schlüssel werden zwei Schlüssel verwendet, nämlich ein privater Schlüssel, der vor Unbefugten geheim gehalten werden muss, und ein öffentlicher Schlüssel, der jedem zugänglich sein kann. Der öffentliche und der private Schlüssel sind mathematisch miteinander verknüpft. Mit dem öffentlichen Schlüssel verschlüsselte Daten können nur mit dem privaten Schlüssel entschlüsselt werden, und mit dem privaten Schlüssel signierte Daten können nur mit dem öffentlichen Schlüssel überprüft werden. Der öffentliche Schlüssel kann jedem zugänglich sein, da er zum Verschlüsseln von Daten verwendet wird, die an den Inhaber des privaten Schlüssels gesendet werden. Beide Schlüssel sind für die Kommunikationssitzung eindeutig. Kryptographische Algorithmen mit öffentlichem Schlüssel werden auch als asymmetrische Algorithmen bezeichnet, da ein Schlüssel für das Verschlüsseln der Daten und ein anderer für das Entschlüsseln erforderlich ist.

Für kryptographische Algorithmen mit öffentlichem Schlüssel wird eine feste Puffergröße verwendet, während solche mit geheimem Schlüssel Puffer mit variabler Länge erfordern. Algorithmen mit öffentlichem Schlüssel können nicht zum Verketten von Daten in Streams verwendet werden, wie das bei Algorithmen mit geheimem Schlüssel möglich ist, da nur kleine Datenmengen verschlüsselt werden können. Daher wird bei asymmetrischen Operationen ein anderes Streamingmodell als bei symmetrischen Operationen verwendet.

Zwei Teilnehmer (Alice und Bob) könnten die Verschlüsselung mit öffentlichem Schlüssel wie folgt verwenden. Zuerst erzeugt Alice ein öffentliches/privates Schlüsselpaar. Wenn Bob Alice eine verschlüsselte Nachricht senden möchte, bittet er Alice um den öffentlichen Schlüssel. Alice sendet Bob ihren öffentlichen Schlüssel über ein unsicheres Netzwerk, und Bob verschlüsselt damit eine Nachricht. (Wenn Bob den Schlüssel von Alice über einen unsicheren Kanal (z. B. ein öffentliches Netzwerk) erhalten hat, muss er bei Alice nachfragen, ob es sich um die richtige Kopie des öffentlichen Schlüssels handelt.) Bob sendet die verschlüsselte Nachricht an Alice, die sie mit ihrem privaten Schlüssel entschlüsselt.

Bei der Übertragung des öffentlichen Schlüssels von Alice hätte jedoch ein Unbefugter den Schlüssel abfangen können. Außerdem hätte derselbe Unbefugte auch die verschlüsselte Nachricht von Bob abfangen können. Er kann die Nachricht mit dem öffentlichen Schlüssel jedoch nicht entschlüsseln. Die Nachricht kann nur mit Alices privatem Schlüssel entschlüsselt werden, der nicht übertragen wurde. Alice benutzt für die Verschlüsselung der Rückantwort an Bob nicht ihren privaten Schlüssel, da jeder mit dem öffentlichen Schlüssel die Nachricht entschlüsseln könnte. Wenn Alice eine Rückantwort an Bob senden möchte, bittet sie Bob um dessen öffentlichen Schlüssel und verschlüsselt ihre Nachricht damit. Bob wiederum entschlüsselt die Nachricht mit seinem zugehörigen privaten Schlüssel.

In der Realität würden Alice und Bob die (asymmetrische) Verschlüsselung mit öffentlichem Schlüssel zum Übertragen eines geheimen (symmetrischen) Schlüssels verwenden und für die restliche Sitzung die Verschlüsselung mit geheimem Schlüssel.

Bei der Verschlüsselung mit öffentlichem Schlüssel steht eine größere Schlüssellänge zur Verfügung, d. h. der Bereich möglicher Werte für den Schlüssel ist größer. Daher ist diese Verschlüsselung weniger anfällig für Brute-Force-Attacken, bei denen alle möglichen Schlüssel ausprobiert werden. Ein öffentlicher Schlüssel ist problemlos zu verteilen, da er nicht geschützt werden muss. Algorithmen mit öffentlichem Schlüssel können zum Erstellen digitaler Signaturen verwendet werden, mit denen die Identität des Absenders der Daten überprüft wird. Diese Algorithmen sind jedoch (im Vergleich zu Algorithmen mit geheimem Schlüssel) extrem langsam und nicht für die Verschlüsselung großer Datenmengen geeignet. Algorithmen mit öffentlichem Schlüssel sind nur für die Übertragung sehr kleiner Datenmengen sinnvoll. In der Regel werden bei der Verschlüsselung mit öffentlichem Schlüssel ein Schlüssel und ein Initialisierungsvektor verschlüsselt, die in einem Algorithmus mit geheimem Schlüssel verwendet werden sollen. Nach der Übertragung von Schlüssel und IV wird für die restliche Sitzung die Verschlüsselung mit geheimem Schlüssel verwendet.

.NET Framework stellt die folgenden Klassen bereit, durch die Verschlüsselungsalgorithmen mit öffentlichem Schlüssel implementiert werden:

Digitale Signaturen

Algorithmen mit öffentlichem Schlüssel können auch für digitale Signaturen verwendet werden. Digitale Signaturen authentifizieren die Identität eines Absenders (wenn Sie dem öffentlichen Schlüssel des Absenders vertrauen) und schützen die Datenintegrität. Mit dem von Alice erzeugten öffentlichen Schlüssel kann der Empfänger von Alices Daten überprüfen, dass sie tatsächlich von Alice gesendet wurden. Dazu vergleicht er die digitale Signatur mit Alices Daten mit ihrem öffentlichen Schlüssel.

Um die Kryptographie mit öffentlichem Schlüssel zum digitalen Signieren einer Nachricht zu verwenden, wendet Alice zunächst einen Hashalgorithmus auf die Nachricht an, um einen Message Digest zu erstellen. Der Message Digest ist eine komprimierte und eindeutige Darstellung von Daten. Danach verschlüsselt Alice den Message Digest mit ihrem privaten Schlüssel und erstellt so ihre persönliche Signatur. Beim Empfang der Nachricht und der Signatur entschlüsselt Bob die Signatur mit dem öffentlichen Schlüssel von Alice, um den Message Digest wiederherzustellen. Dann wendet er denselben Hashalgorithmus auf die Nachricht an, den auch Alice verwendet hat. Wenn der von Bob ermittelte Message Digest exakt mit dem von Alice empfangenen Message Digest übereinstimmt, kann Bob sicher sein, dass die Nachricht vom Besitzer des privaten Schlüssels stammt und die Daten nicht modifiziert wurden. Wenn Bob darauf vertraut, dass Alice der Besitzer des privaten Schlüssels ist, weiß er, dass die Nachricht von Alice stammt.

Beachten Sie, dass eine Signatur von jedem überprüft werden kann, da der öffentliche Schlüssel des Absenders allgemein bekannt und in der Regel im digitalen Signaturformat enthalten ist. Mit dieser Methode wird die Nachricht nicht geheim gehalten. Hierzu muss sie zusätzlich verschlüsselt werden.

.NET Framework stellt die folgenden Klassen bereit, durch die digitale Signaturalgorithmen implementiert werden:

Hashwerte

Mit Hashalgorithmen werden kleinen binären Werten fester Länge, die als Hashwerte bezeichnet werden, binäre Werte beliebiger Länge zugeordnet. Ein Hashwert ist eine eindeutige und äußerst komprimierte numerische Darstellung eines Datenelements. Wenn ein Klartextabsatz gehasht ist und nur ein Buchstabe geändert wird, ergibt sich bei einem nachfolgenden Hashvorgang ein anderer Wert. Es ist rechnerisch unmöglich, zwei verschiedene Eingabewerte zu ermitteln, die denselben Hashwert bilden.

Bei digitalen Signaturen werden zum Signieren von Daten häufig MAC-Hashfunktionen (Message Authentication Code; Nachrichtenauthentifizierungscode) verwendet, während die Datenintegrität mit MDC (Message Detection Code)-Hashfunktionen sichergestellt wird.

Zwei Teilnehmer (Alice und Bob) könnten mit einer Hashfunktion die Datenintegrität wie folgt sicherstellen: Alice schreibt eine Nachricht an Bob und erstellt von dieser Nachricht ein Hash. Bob erstellt dann von dieser Nachricht erneut ein Hash und vergleicht sein Hash mit dem originalen Hash. Wenn die Hashwerte identisch sind, wurde die Nachricht nicht geändert. Bei unterschiedlichen Werten ist die Nachricht nach dem Verfassen geändert worden. Damit dieses System funktioniert, muss Alice den originalen Hashwert geheim halten. Nur Bob darf ihn kennen.

.NET Framework stellt die folgenden Klassen bereit, durch die digitale Signaturalgorithmen implementiert werden:

Zufallszahlengenerierung

Die Zufallszahlengenerierung ist wichtiger Bestandteil vieler kryptographischer Vorgänge. Kryptographische Schlüssel müssen z. B. möglichst zufällig erzeugt werden, so dass ein Replizieren unmöglich ist. Mit Generatoren für kryptographische Zufallszahlen müssen Ausgabewerte erzeugt werden, die rechnerisch mit einer Wahrscheinlichkeit von weniger als 0,05 % vorhergesagt werden können. Das heißt, jede Methode zur Vorhersage des nächsten Ausgabebits darf nicht besser sein als eine bloße Vermutung. Die Klassen in .NET Framework erzeugen mit Zufallszahlengeneratoren kryptographische Schlüssel.

Die RNGCryptoServiceProvider-Klasse ist eine Implementierung eines Algorithmus mit Zufallszahlengenerator.

Siehe auch

Das Kryptographiemodell in .NET Framework | Kryptographische Aufgaben | Kryptographische Dienste