Digitale Unterschriften

Eine Hash-Funktion [1] 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.[2] 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, daß 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 Unterschrift erzeugen, ohne daß 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, daß 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.

Fußnoten

[1]

Eine einfache Hash-Funktion ist f(x) = 0 für alle ganzen Zahlen x. Eine interessantere Hash-Funktion ist f(x) = x mod 37, welche x auf den Rest von x dividiert durch 37 abbildet.

[2]

Die Verschlüsselung muß die Eigenschaft haben, daß der aktuelle öffentliche oder private Schlüssel vom Verschlüsselungsverfahren als der öffentliche Schlüssel benutzt werden könnte. RSA ist ein Beispiel eines solchen Verfahrens, ElGamal dagegen nicht.