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]