Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Ver- und entschlüsseln von Texten mit PGP

Geschrieben von: Christian Koller
Kategorie: Sicherheit

This printed page brought to you by AlphaSierraPapa

Man kann in ASP Seiten mit Hilfe einer Komponente Texte mittels PGP ver- und entschlüsseln. Leider ist mir keine ActiveX-Komponente bekannt, die diese Funktionalität direkt integriert hat. Jedoch kann man die Funktionalität der NSDPGP Komponente dazu benutzen, um beliebige PGP-verschlüsselte Texte zu entschlüsseln, oder Texte mittels PGP zu verschlüsseln.

Die Installation und Verwendung der NSDPGP Komponente können Sie im Artikel PGP-Verschlüsselung bei Dateien nachlesen.

Die NSDPGP Komponente erlaubt es, Dateien mittels PGP zu verschlüsseln. Außerdem kann man Dateien, die mittels PGP verschlüsselte Text enthalten, mit der NSDPGP Komponente wieder entschlüsseln.

Leider kann NSDPGP nur Dateien und keine Textstrings direkt bearbeiten. Sowohl der verschlüsselte als auch der entschlüsselte Text müssen auf der Festplatte liegen, egal ob man mittels NSDPGP eine PGP-Verschlüsselung oder eine PGP-Entschlüsselung durchführt.

Man kann aber unter ASP einen beliebigen Text auf der Festplatte speichern. Dies ermöglicht das FileSystemObject Objekt, das fixer Bestandteil von VBScript und JScript ist - damit kann man in ASP Dateien schreiben und wieder lesen. Daher ist es, wenn auch über Umwege, möglich, mittels ASP beliebige Texte mittels PGP zu manipulieren.

Verschlüsseln beliebiger Texte

Damit eine ASP Seite überhaupt die PGP Algorithmen anwenden kann, muß sowohl PGP (Version 6.5.1 oder höher) sowie die NSDPGP Komponente am Webserver installiert sein.

Das folgende ASP-Skript benutzt den PGP Schlüssel "TestPGP <testpgp@aspexpert.com>" mit der Key ID=0xD6863683 um einen vom User eingegebenen Text zu verschlüsseln. Der PGP Key ist im Download zu diesem Artikel in der Datei TestPGP.asc enthalten, wobei der darin enthaltene Schlüssel mittels Doppelklick auf die Datei in die am Computer installierten PGP Keys übernommen werden kann. Die Passphrase für den Schlüssel ist "Pass".

Natürlich können Sie auch einen anderen PGP Key zur Verschlüsselung benutzen. Dazu muß der "Private Key" des PGP Keys am Webserver vorhanden sein. Die PGP Key IDs können Sie im Programm PGPKeys (in der Programmgruppe PGP des Start Menüs) herausfinden, indem Sie mit der rechten Maustaste auf einen Schlüssel klicken und Key Properties wählen.

Das folgenden Skript nimmt die Usereingaben (PGP Key ID, Passphrase und zu verschlüsselnder Text) entgegen. Der Text wird in eine Datei auf die Festplatte geschrieben, dort mittels NSDPGP Komponente verschlüsselt und in einer anderen Datei gespeichert.

Die verschlüsselte Ergebnisdatei wird vom ASP Skript ausgelesen und beide temporären Dateien mittels NSDPGP unwiederbringlich gelöscht.

Das nachfolgende Listing ist ein Auszug aus dem Skript encodepgp.asp, dessen Sourcecode Sie im Download finden:

<% @LANGUAGE="VBscript" %>
 <%
 ' Funktionen zum PGP Ver- und Entschluesseln:
 Function EncodePGP(strText, PGPKey, ByRef strPGPEncodedText)
    Dim FolderPhys, FileNameSource, FileNameEnc
    Dim FilePhysSource, FilePhysEnc
    Dim bWrite, bRead
    ' Dateiordner, in dem die Dateien temporaer gespeichert werden:
    FolderPhys = "C:\Temp\"
 
    FileNameSource = GetTempFileName
    FileNameEnc = FileNameSource & ".pgp"
 
    FilePhysSource = FolderPhys & FileNameSource
    FilePhysEnc = FolderPhys & FileNameEnc
    
    bWrite = WriteTextFile(FilePhysSource, strText)
    EncodePGPFile FilePhysSource, FilePhysEnc, PGPKey
    
    bRead = ReadTextFile(FilePhysEnc, strPGPEncodedText)
 
    ' Aufraeumen
    If bWrite Then
       PGPWipeFile FilePhysSource
    End If
    If bRead Then
       PGPWipeFile FilePhysEnc
    End If
    
    EncodePGP = bRead And bWrite
 End Function
 ' ----------------------------------------------------
 Function EncodePGPFile(FileNameSource, FileNameEnc, PGPKey)
    Dim objPGP
    
    ' PGP Objekt instanzieren
    Set objPGP = CreateObject("NSDPGP")
    ' Datei mit PGP verschluesseln
    ' Syntax: objPGP.EncryptFileEx Signfile, _
    '  Quelldatei, PGP_ErgebnisDatei, Paßwort
    ' Anmerkung: Der Inhalt des Paßworts wird
    ' nur benoetigt um den Inhalt mittels PGP zu "signen"
    objPGP.EncryptFileEx PGPKey, "NOSIGN", _
       FileNameSource , FileNameEnc, ""
 
    Set objPGP = Nothing
 End Function
 ' ----------------------------------------------------
 Function PGPWipeFile(FileName)
    Set objPGP = CreateObject("NSDPGP")
    ' Datei unwiederbringlich loeschen
    objPGP.WipeFile FileName
    Set objPGP = Nothing
 End Function
 
 ' ... 
 
 ' ----------------------------------------------------
 ' Hauptprogramm:
 ' ----------------------------------------------------
 
 Dim strPassphrase, strText, strPGPText
 
 If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
    isPostBack = True
    strText = Trim(Request.Form("Text"))
    strPGPKeyID = Trim(Request.Form("PGPKeyID"))
 Else
    isPostBack = False
    strText = "Dieser Text wird mittels PGP verschluesselt!"
    strPGPKeyID = "0xD6863683"
 End If
 
 If isPostBack = False then
    ' Formular ausgeben:
    %>
 <form action="<%= Request.ServerVariables("SCRIPT_NAME") %>"
    method="POST">
    PGP Key ID:
    <input type="Text" name="PGPKeyID" value="<%= strPGPKeyID %>">
    <br>
    <textarea name="text" cols="40" rows="10" wrap="VIRTUAL"><%= strText %>
    </textarea><br>
    <input type="Submit" name="Submit" value="Submit">
 </form>
    <%
 Else
    ' Text verschluesseln und darstellen
    bOK = EncodePGP(strText, strPGPKeyID, strPGPText)
    If bOK Then
       Response.Write("<b>Der verschl&uuml;sselte Text lautet:" & _
      "</b><BR><br>")
       Response.Write("<pre>" & strPGPText & "</pre>")
    Else
       Response.Write("Es ist ein Fehler aufgetreten, " & _
          "der Text konnte nicht verschl&uuml;sselt werden!<BR>")
    End If
    Response.Write("<BR>")
    Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _
       """>Zur&uuml;ck</a>")
 End If
 %>

Dieses ASP Skript übernimmt die vom Benutzer geposteten Eingaben (PGP Key ID, Passphrase und Text wie in Bild 1 dargestellt) und ruft die Funktion EncodePGP auf, die sich um die Verschlüsselung des Textes kümmert.


Bild 1: Eingabeformular zum Verschlüsseln des Textes

EncodePGP schreibt den zu verschlüsselnden Text mittels der Funktion WriteTextFile in eine Datei (FilePhysSource). Der Aufruf der Funktion EncodePGPFile bewirkt, daß die unverschlüsselte Datei (FilePhysSource) von der NSDPGP Komponente verschlüsselt, und der verschlüsselte Text in eine weitere Datei (FilePhysEnc) geschrieben wird.

Die Funktion EncodePGP ruft danach die Funktion ReadTextFile auf, die den verschlüsselten Inhalt der zweiten Datei (FilePhysEnc) ausliest. Danach werden beide temporären Dateien mittels der Funktion PGPWipeFile wieder von der Festplatte gelöscht. Die Funktion PGPWipeFile bedient sich dabei der WipeFile Methode des NSDPGP Objektes, um eine Datei unwiederbringlich von der Festplatte zu löschen.

Das Ergebnis der Verschlüsselung sieht dann ähnlich wie in Bild 2 aus.


Bild 2: Ausgabe des verschlüsselten Textes

Schwierigkeiten können bei Benutzung des FileSystemObject Objektes auftreten, da zum Schreiben von Dateien aus ASP die Schreibberechtigung für den Benutzer IUSR_MachineName, in dessem Kontext ASP Seiten ausgeführt werden, gesetzt sein muß. Eine ausführliche Diskussion dieser Thematik finden Sie im AspHeute Artikel Schreiben einer Textdatei auf den Server.

Entschlüsseln beliebiger Texte

Auf die selbe Art und Weise wie das Verschlüsseln funktioniert auch das Entschlüsseln.

Das Skript decodepgp.asp demonstriert, wie dies mittels ASP funktioniert. Hier ein Auszug aus diesem Skript:

 <% @LANGUAGE="VBscript" %>
 <%
 Function DecodePGP(strPGPEncodedText, Passphrase, ByRef strDecodedText)
    Dim FolderPhys, FileNameSource, FileNameDec
    Dim FilePhysSource, FilePhysDec
    Dim bWrite, bRead
    ' Dateiordner, in dem die Dateien temporaer gespeichert werden:
    FolderPhys = "C:\Temp\"
 
    FileNameDec = GetTempFileName
    FileNameSource = FileNameDec & ".pgp"
 
    FilePhysSource = FolderPhys & FileNameSource
    FilePhysDec = FolderPhys & FileNameDec
    ' Datei auf Server schreiben
    bWrite = WriteTextFile(FilePhysSource, strPGPEncodedText)
 
    ' Datei mittels PGP entschluesseln
    DecodePGPFile FilePhysSource, FilePhysDec, Passphrase
    
    ' Entschluesselte Datei lesen
    bRead = ReadTextFile(FilePhysDec, strDecodedText)
 
    ' Aufraeumen, temporaere Dateien loeschen
    If bWrite Then
       PGPWipeFile FilePhysSource
    End If
    If bRead Then
       PGPWipeFile FilePhysDec
    End If
    
    DecodePGP = bRead And bWrite
 End Function
 ' ----------------------------------------------------
 Function DecodePGPFile(FileNameSource, FileNameDec, Passphrase)
    Dim objPGP
    
    ' PGP Objekt instanzieren
    Set objPGP = CreateObject("NSDPGP")
 
    ' Datei mit PGP entschluesseln:
    ' Syntax: objPGP.DecryptFileEx Signfile, _
    '  PGP_Quelldatei, ErgebnisDatei, Paßwort
    objPGP.DecryptFileEx "NOSIGN", _
       FileNameSource , FileNameDec, Passphrase
 
    Set objPGP = Nothing
 End Function
 ' ----------------------------------------------------

  ...
 
 ' ----------------------------------------------------
 ' Hauptprogramm:
 ' ----------------------------------------------------
 
 Dim Passphrase, strPGP
 Dim strPassphrase, strText, strPGPText
 
 ' Hier default PGP Nachricht einfuegen:
 strPGP = _
 "-----BEGIN PGP MESSAGE-----" & vbcrlf & _
 ...
 "-----END PGP MESSAGE-----" & vbcrlf
 
 If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
    isPostBack = True
    strPGPText = Trim(Request.Form("PGPText"))
    strPassphrase = Trim(Request.Form("Passphrase"))
 Else
    isPostBack = False
    strPGPText = strPGP
    strPassphrase = "Pass"
 End If
 
 If isPostBack = False then
    ' Formular ausgeben:
    %>
 <form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" 
    method="POST">
    Passphrase: 
    <input type="Text" name="Passphrase" value="<%= strPassphrase %>">
    <br>
    <textarea name="PGPText" cols="70" rows="20" wrap="VIRTUAL">
    <%= strPGPText %></textarea><br>
    <input type="Submit" name="Submit" value="Submit">
 </form>
    <%
 Else
    ' Text entschluesseln und darstellen
    bEncrypted = DecodePGP (strPGPText, strPassphrase, strDecText)
    If bEncrypted Then
       Response.Write("<b>Der entschl&uuml;sselte Text lautet:</b>" & _
      "<BR><br>")
       Response.Write("<pre>" & strDecText & "</pre>")		 
    Else
       Response.Write("Es ist ein Fehler aufgetreten, " & _
          "der Text konnte nicht entschl&uuml;sselt werden!<BR>")
    End If
    Response.Write("<BR>")
    Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _
       """>Zur&uuml;ck</a>")
 End If
 %>

Das Skript präsentiert ein Formular, in das der Benutzer die PGP verschlüsselte Nachricht und die Passphrase zum Entschlüsseln eingibt (siehe Bild 3).


Bild 3: Formular zum Entschlüsseln

Die Formularwerte werden von ASP ausgelesen und der verschlüsselte Text in der Funktion namens DecodePGP entschlüsselt. Dazu verwendet die Funktion DecodePGP, die wiederum die Funktion DecodePGPFile aufruft. In der Funktion DecodePGPFile wird der verschlüsselte Text in eine Datei geschrieben und danach diese Datei mittels der DecryptFileEx Methode der NSDPGP Komponente entschlüsselt. Da NSDPGP den entschlüsselten Text wieder in einer Datei auf der Festplatte speichert, liest das ASP Skript den Inhalt dieser Datei aus, bevor es schließlich beide temporäre Dateien mittels WipeFile Funktion der NSDPGP Komponente löscht.

Der entschlüsselte Text wird schließlich wieder im Browser ausgegeben, siehe auch Bild 4.


Bild 4: Ausgabe des entschlüsselten Textes

Die Funktionen, die zum Schreiben und Lesen der Dateien zuständig sind können Sie im vollen Sourcecode lesen, der im Download zu diesem Artikel enthalten ist.

Schlußbemerkung

Das Entschlüsseln von beliebigen PGP-verschlüsselten Texten ist unter ASP möglich. Die einzig mir bekannte Komponente, die ein COM-Interface zum Ver- und Entschlüsseln mittels PGP zur Verfügung stellt, ist die NSDPGP Komponente.

Die Einschränkungen der NSDPGP Komponente kann man elegant umgehen, indem man das FileSystemObject Objekt benutzt, das in den Skriptsprachen VBScript und JScript, und damit auch unter ASP zur Verfüfung steht.

Um die PGP Funktionalität am Webserver einzurichten, muß man PGP Version 6.5.1 oder höher, sowie die Komponente NSDPGP installieren.

Natürlich müssen zum Verschlüsseln die dazu nötigen "Public Keys" in PGP vorhanden sein. Zum Entschlüsseln benötigt man darüber hinaus noch den "Private Key" und das Paßwort in Form der sogenannten Passphrase.

Will man das PGP Ver- und Entschlüsseln wie in diesem Artikel beschrieben einsetzen, so gilt es zu bedenken, daß das Schreiben und Lesen von Dateien nicht nur relativ langsam funktioniert, sondern auch die Schreib- und Leseberechtigung für den IUSR_MachineName Account für die Verzeichnisse gesetzt sein muß, in die ein ASP Skript Dateien schreibt bzw. Dateien liest.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000921.zip

Verwandte Artikel

Aber bitte mit Rijndael
http:/www.aspheute.com/artikel/20010528.htm
CAPICOM One
http:/www.aspheute.com/artikel/20020115.htm
Passwörter mit SHA1 absichern
http:/www.aspheute.com/artikel/20010330.htm
Passwörter speichern - aber richtig!
http:/www.aspheute.com/artikel/20040105.htm
PGP-Verschlüsselung bei Dateien
http:/www.aspheute.com/artikel/20000920.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Unknackbare Verschlüsselung mit Onetime Pads
http:/www.aspheute.com/artikel/20010924.htm

Links zu anderen Sites

NSDPGP Komponente
http://community.wow.net/grt/nsdpgp.html
PGP
http://www.pgpi.org/products/pgp/versions/freeware

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.