Eine Hash-Funktion [*]ist eine kryptographische
Prüfsumme. Durch
eine eindeutige Funktion wird aus einer Datei eine wesentlich
kürzere Datensequenz erzeugt, die ein eindeutiges Abbild der
Ursprungsdatei ist.
Die digitale Unterschrift eines Dokumentes ist das Ergebnis der
Anwendung einer Hash-Funktion auf das Dokument. Um für digitale
Unterschriften brauchbar zu sein, muß die Hash-Funktion jedoch
zwei wichtige Eigenschaften haben:
Erstens sollte es unmöglich sein, zwei Dokumente zu finden, die
dasselbe Hash-Ergebnis haben. Zweitens sollte es bei einem
gegebenen Hash-Ergebnis schwer sein, das ursprünglich Dokument
wiederherzustellen, aus dem dieser Hash erzeugt wurde.
Einige Public-Key-Verfahren könnten auch zum Unterschreiben von
Dokumenten benutzt werden. [**] Der Unterzeichner
verschlüsselt das
Dokument mit seinem privaten Schlüssel. Jeder,
der die Unterschrift prüfen und das Dokument sehen will, benutzt
einfach den öffentlichen Schlüssel des Unterzeichners, um das
Dokument zu entschlüsseln. Dieses Verfahren besitzt in der Tat die
beiden Eigenschaften, die eine gute Hash-Funktion braucht, doch
ist es in der Praxis zu langsam, um effektiv nutzbar zu sein.
Besser ist es, spezielle Hash-Algorithmen zu benutzen, welche
diese beiden wichtigen Eigenschaften aufweisen; wie beispielsweise
SHA1 und RIPE-MD160. Bei einem solchen Verfahren wird der
Hash-Wert eines Dokumentes als Unterschrift verwendet. Man kann
die Unterschrift dadurch prüfen, dass man auf die Kopie des
Dokumentes ebenfalls die Hash-Funktion anwendet und den Hash-Wert,
den man erhält, mit dem Hash-Wert des Originaldokumentes
vergleicht. Wenn beide Werte übereinstimmen, dann sind beide
Dokumente identisch.
Das Problem ist jetzt natürlich, Hash-Funktionen für digitale
Unterschriften zu benutzen, ohne einem Angreifer das Manipulieren
der Unterschrift zu ermöglichen. Wenn das Dokument und die
Unterschrift unverschlüsselt geschickt werden, könnte ein
Angreifer das Dokument verändern und eine entsprechende neue
xxUnterschrift erzeugen, ohne dass der Empfänger es merkt. Wenn nur
das Dokument verschlüsselt wird, könnte ein Angreifer die
Unterschrift verfälschen und so das Scheitern einer
Unterschriftsprüfung verursachen.
Eine dritte Möglichkeit besteht darin, ein hybrides Verfahren zu
benutzen, um sowohl die Unterschrift als auch das Dokument zu
verschlüsseln. Der Unterzeichner benutzt seinen privaten
Schlüssel, und jedermann kann dessen öffentlichen Schlüssel
benutzen, um die Unterschrift und das Dokument zu prüfen. Dies
klingt zwar gut, ist aber in Wirklichkeit Unsinn. Wenn dieses
Verfahren das Dokument wirklich sichern könnte, würde es dieses
auch gegen Verfälschung sichern, und dann wäre die Unterschrift
gar nicht nötig. Das ernstlichere Problem ist jedoch, dass dies
keinen Schutz gegen Verfälschung bietet, weder für die
Unterschrift noch für das Dokument. Bei diesem Verfahren wird nur
der Sitzungsschlüssel für die symmetrische Verschlüsselung unter
Benutzung des privaten Schlüssels des Unterzeichners
verschlüsselt. Jeder kann den öffentlichen Schlüssel benutzen, um
den Sitzungsschlüssel wiederherzustellen. Deshalb ist es für einen
Angreifer einfach, den Sitzungsschlüssel wiederherzustellen und
ihn zum Verschlüsseln von Ersatzdokumenten und
Ersatzunterschriften zu benutzen, die er dann im Namen des
Absenders an andere schickt.
Ein wirklich funktionierendes Verfahren ist es, nur die
Unterschrift mit einem Public-Key-Verfahren zu verschlüsseln. Das
heißt, es wird der geheime Schlüssel des Unterzeichners benutzt,
um die digitale Unterschrift zu erzeugen, die dann jeder mit dem
dazugehörigen öffentlichen Schlüssel checken kann. Das
unterzeichnete Dokument kann man unverschlüsselt verschicken, wenn
es öffentlich ist oder verschlüsselt, wenn es vertraulich ist.
Wenn das Dokument nach dem Unterzeichnen verändert wurde,
wird die Unterschriftsprüfung negativ ausfallen. Der von
GnuPG standardmäßig benutzte Digital Signature
Algorithm (DSA) arbeitet nach dieser
Methode.
|