Date: Sun, 5 Dec 1999 13:12:59 -0500 (EST)
From: support@redtenbacher.de
Subject: Automat. Ver-/Entschluesselung von E-Mail, Teil IIIb
Sehr geehrte "signatur"-Abonnenten,
sobald das bestehende E-Mail-System über eine Dateischnittstelle
verfügt (vgl. Teil IIIa, "Einfügen einer Dateischnittstelle in
ein bestehendes Mailsystem"), können wir die Routinen zur
automat. Ver-/Entschlüsselung/Signatur von E-Mail über ein
geeignetes Zusatzprogramm realisieren, ohne das
E-Mail-Basissystem ersetzen zu müssen.
Als vorbereitenden Schritt für die Formate und Algorithmen bei
Eingangs- und Ausgangsmails (Schritte 3 und 4) wollen wir uns im
aktuellen Schritt 2 das Thema der Paßwortverwaltung anschauen.
Schritt 2: Paßwortverwaltung, -speicherung und Diebstahlschutz
Beim manuellen Einsatz von PGP (oder eines dazu kompatiblen
Programms) fragt das Programm beim Entschlüsseln oder Signieren
nach dem Paßworttext ("pass phrase") des zugehörigen privaten
Schlüssels.
Im Fall einer automatisierten Ver-/Entschlüsselung/Signatur muß
diese Übergabe natürlich automatisch erfolgen, da zu diesem
Zeitpunkt kein Bediener anwesend ist, der eine solche Frage
beantworten könnte.
Daher muß hier das Steuerprogramm die Paßwörter aller privaten
PGP-Schlüssel kennen, für die automatisch entschlüsselt werden
soll, und bei Bedarf jeweils den richtigen Schlüssel samt Paßwort
an PGP übergeben. Um bei dieser Vorgehensweise Mißbrauch oder
Diebstahl auszuschließen, gibt es 2 Wege:
1. Bei jedem Start der Mailserver-Software werden die
entsprechenden Paßwörter vom Mail-Administrator erfragt und
nur für die Laufzeit des Programms im RAM gespeichert.
Oder:
2. Beim ersten Start der Mailserver-Software werden die
entsprechenden Paßwörter erfragt und anschließend in
verschlüsselter Form auf der Festplatte gespeichert. Dabei
erfolgt die Verschlüsselung maschinenabhängig, d.h. beim
Transport auf ein anderes System (oder beim Ändern der
Konfigurationsbestandteile, die zur Identifizierung des PCs
dienen) werden die Paßwörter neu erfragt (Diebstahlschutz).
"KT-MAIL/Krypto" verwendet den 2. Weg. Somit bleiben
PGP-Paßwörter, die dem Krypto-Modul einmal mitgeteilt wurden,
auch beim Beenden und Neustarten des Mailservers erhalten.
Lediglich für später hinzugefügte, private PGP-Keys werden beim
Start der Mailserver-Software die Paßwörter erfragt, und beim
Ändern der Server-Konfiguration werden _alle_ Paßwörter neu
erfragt, um zu vermeiden, daß jemand einfach "KT-MAIL/Krypto"
inklusive der Paßwortdateien stehlen und auf einem anderen PC nun
die "Stadt XY" simulieren könnte.
Die entsprechende Vorgehensweise von "KT-MAIL/Krypto" wird
nachfolgend in Pseudo-Code näher beschrieben. ("Pseudo-Code"
ist eine Formulierung, die Konstrukte wie "IF ... THEN ...",
"GOTO ..." und Sprungmarken benutzt, den Inhalt von Bedingungen
oder Prozeduren jedoch in beschreibender Sprache formuliert.
Dadurch kann man Algorithmen kompakt und schnell beschreiben,
ohne in Details einer bestimmten Programmiersprache oder eines
bestimmten Entwicklungssystems zu introvertieren.)
Initialisierungsroutine von KT-MAIL/Krypto (die beim Start der
Mailserver-Software aufgerufen wird):
IF (eine benötigte Datei fehlt)
THEN
Abbruch mit Fehlermeldung
END;
[Hinweis: Hier wird z.B. die Existenz von Dateien wie PGP.EXE,
PGPK.EXE, PGPSCAN.EXE, KRYPTO.TAB, PUBRING.PKR, SECRING.SKR
usw. geprüft, die das Programm im weiteren Ablauf benötigt.]
IF (Datei KRYPTO.LST ist älter als SECRING.SKR oder hat
unpassenden Inhalt)
THEN
Erzeuge KRYPTO.LST neu über einen Befehl folgender Art:
"pgpk -l >krypto.lst"
END;
[Hinweis: KRYPTO.LST ist die Liste der PGP-Schlüssel auf dem
eigenen Schlüsselbund, der u.a. entnommen werden kann, welche
privaten Schlüssel vorhanden sind und welche User-IDs zu
welchem Schlüssel gehören.]
[Als nächstes werden die KeyIDs der privaten PGP-Keys und die
zugehörigen Paßworttexte in Variablen geholt:]
IF (Datei KRYPTO.INI existiert)
THEN
Versuche sie zu laden und zu entschlüsseln;
IF (Entschlüsseln klappt)
THEN
Benutze den Dateiinhalt für die untenstehende
Ausleseschleife
ELSE
Tue so, als ob eine leere Datei KRYPTO.INI geladen worden
wäre
END;
ELSE
Tue so, als ob eine leere Datei KRYPTO.INI geladen worden
wäre
END;
[Hinweise: (a) Die verschlüsselte Datei KRYPTO.INI enthält die
Liste der privaten PGP-Keys mit Paßwörtern, die bereits früher
eingegeben wurden. Aufbau der Datei siehe unten.
(b) "KT-MAIL/Krypto" ver-/entschlüsselt die Datei KRYPTO.INI
direkt beim Schreiben auf die (bzw. Lesen von der) Festplatte,
so daß auf der Festplatte nie eine unverschlüsselte Version der
Datei auftaucht. Als Paßworttext für diese _symmetrische_
Verschlüsselung wird eine Zeichenfolge benutzt, die aus
diversen Systemmerkmalen automatisch erzeugt wird. Scheitert
die Entschlüsselung, so stehen die gespeicherten Paßwörter
nicht mehr zur Verfügung und werden daher - wie beim Hinzufügen
weiterer privater PGP-Keys - neu erfragt.]
Lade die Datei KRYPTO.LST (siehe oben);
[Als nächstes werden nun die privaten PGP-Keys in einer
Schleife aus der Datei KRYPTO.LST ausgelesen:]
Sprungmarke "NextIniKey":
Suche in der Datei KRYPTO.LST ab der akt. Zeile jeweils in den
ersten 3 Zeichen aller Zeilen nach dem nächsten Auftreten der
Zeichenfolge "sec" [für "secring"]:
IF (kein [weiteres] Auftreten gefunden)
THEN
GOTO DoneIniKeys
END;
[Hinweis: Hier befindet sich in der gefundenen Zeile jetzt ein
Inhalt der Art:
"sec+ 1024 0x8A4A53E8 1999-07-09 ---------- DSS ..."]
Speichere die KeyID dieses Schlüssels mit Verweis auf den
zugehörigen Signaturkey in einer Variablen, z.B. in der Form:
PGPKeyxxxxxxxx := "xxxxxxxx";
(wobei "xxxxxxxx" die KeyID [= 3. Angabe in der Zeile]
ist, im obigen Beispiel also "8A4A53E8")
Sprungmarke "NextSubKey":
Geh zur nächsten Zeile und prüfe die erste Angabe dieser neuen
Zeile:
IF (dort steht "sub")
[Hinweis: Dann befindet sich in der akt. Zeile jetzt ein
Inhalt der Art:
"sub 2048 0xD7900CAE 1999-07-09 ---------- Diffie-Hellman"]
THEN
Speichere die KeyID dieses Subkeys ähnlich wie oben mit
Verweis auf den zugehörigen Signaturkey;
GOTO NextSubKey
[Hinweise: (a) Der Paßworttext hängt am Signaturkey, daher muß
die Beziehung zwischen Subkey und Signaturkey bekannt sein.
(b) Die Speicherung erfolgt wiederum in der Art:
PGPKeyzzzzzzzz := "xxxxxxxx",
wobei "zzzzzzzz" die KeyID in der akt. Zeile (im obigen
Beispiel also der Subkey "D7900CAE") ist und "xxxxxxxx"
den Wert aus der zugehörigen "sec"-Zeile (im obigen Beispiel
also "8A4A53E8") angibt.]
ELSIF (dort steht "uid")
THEN
GOTO NextSubKey
END;
[Hier sind die Subkeys und User-IDs des akt. privaten Schlüssels
zu Ende.]
IF (für diesen Signaturkey ist bereits ein Paßworttext
in der Datei KRYPTO.INI gespeichert)
THEN
Entnimm den Paßworttext der geladenen Datei KRYPTO.INI
ELSE
Zeige den Schlüssel inkl. User-ID an und erfrage den
zugehörigen Paßworttext vom Mailserver-Administrator
END;
Merke dir den Paßworttext zum Signaturschlüssel;
[z.B. durch eine Variable der folgenden Art:
PGPPWxxxxxxxx := "<Paßworttext>";
(wobei "xxxxxxxx" wieder die KeyID des Signaturschlüssels
ist)]
GOTO NextIniKey;
Sprungmarke "DoneIniKeys":
Schließe das Fenster mit der Datei KRYPTO.LST;
Erzeuge den maschinenabhängigen Paßworttext für symmetrische
Verschlüsselung der Datei KRYPTO.INI (s.o.);
Erzeuge ein (unsichtbares!) Fenster mit den Paßworttexten
PGPPWxxxxxxxx := "<Paßworttext>" (s.o.), und speichere diesen
Fensterinhalt als Datei KRYPTO.INI verschlüsselt auf der
Festplatte ab;
ENDE der Initialisierungsroutine.
Wie man an der Art der durchzuführenden Schritte erkennen kann,
läßt sich die Steuerlogik der automatischen Ver-/Entschlüsselung
von E-Mail am leichtesten in einer Automatisierungssprache
realisieren, die von vornherein Befehle wie "Fenster öffnen",
"Datei einlesen", "Im akt. Fenster suchen", "Externes Programm
aufrufen" u.ä. zur Verfügung stellt. Sofern man daher Zugriff auf
eine solche Sprache hat (und diese robust implementiert ist!),
sinkt der Implementierungsaufwand dadurch deutlich gegenüber der
Verwendung einer konventionellen Programmiersprache wie "Pascal",
"Modula-2", "C", "C++" o.ä.
Im nächsten Abschnitt behandeln wir dann den Ablauf bei der
Abwicklung von Signatur/Entschlüsselung von Eingangsmails.
- Wolfgang Redtenbacher
"signatur"-Moderator
[Zurück zur Hauptseite des
Verschlüsselungsprojekts]