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

PGP-Verschlüsselung bei Dateien

Geschrieben von: Christian Koller
Kategorie: Sicherheit

This printed page brought to you by AlphaSierraPapa

PGP ist ein Verschlüsselungssystem, mit dessen Hilfe man vertrauliche Daten Ver- und Entschlüsseln kann (siehe auch Artikel Mit PGP verschlüsselte e-Mails senden).

Dies ist besonders hilfreich, wenn man Nachrichten in Emails oder Attachments verschlüsseln will. Ein anderes Anwendungsgebiet wäre, Dateien am Webserver zu verschlüsseln, um diese gefahrlos zum Download zur Verfügung zu stellen. Die downgeloadeten Dateien kann man nur mit dem richtigen "Private Key" und einer Passwortphrase wieder entschlüsseln.

Dieser Artikel zeigt, wie man von ASP Seiten aus Dateien auf dem Webserver verschlüsselt.

PGP selbst hat leider keine ActiveX kompatible COM-Schnittstelle, die man aus einem ASP Skript heraus angreifen könnte. Allerdings gibt es die gratis Komponente NSDPGP (erstellt von Gerard Thomas), die eine COM Schnittstelle zur PGP Software darstellt.

Um nun NSDPGP benützen zu können, muß am Webserver die PGP Software installiert und die benötigten Verschlüsselungsdateien (Key Files) am Webserver vorhanden sein. Wie man PGP am Webserver installiert können Sie im AspHeute Artikel Mit PGP verschlüsselte e-Mails senden detailliert nachlesen.

Hier soll speziell auf die Installation der NSDPGP.dll am Webserver und auf die Benutzung des COM-Interfaces mittels ASP eingegangen werden.

Installation der NSDPGP Komponente

Die NSDPGP.dll samt Dokumentation steht jedermann zum Download von der Webseite http://community.wow.net/grt/nsdpgp.html zur Verfügung. NSDPGP kann für kommerzielle Zwecke gratis eingesetzt werden, wie der mitgelieferten License.txt Datei entnommen werden kann.

Prinzipiell arbeitet NSDPGP mit PGP der Version 6.5.1 (oder höher) zusammen.

Nachdem man NSDPGP.zip downgeloadet hat, entpackt man es in ein beliebiges Verzeichnis. Die Datei NSDPGP.DLL kopiert man anschließend in das system32 Verzeichnis des Betriebssystems, für gewöhnlich also in C:\WINNT\system32.

Danach muß man die DLL registrieren um sie benutzen zu können. Dies geschieht durch folgenden Befehl, den man in der Kommandozeile (DOS-Fenster) eingibt:

REGSVR32 NSDPGP.DLL

Um die DLL wieder zu deinstallieren, benutzen Sie den Befehl REGSVR32 /U NSDPGP.DLL und löschen Sie die Datei NSDPGP.DLL.

Benutzung von NSDPGP

Um die Funktionalität des NSDPGP Objektes nützen zu können, erstellen Sie das Objekt mit CreateObject:

Set objPGP = CreateObject("NSDPGP")

Zum Ver- und Entschlüsseln von Dateien stellt das NSDPGP Objekt die folgenden Funktionen zur Verfügung:

Die Benutzung der EncryptFileEx und DecryptFileEx Methoden möchte ich mit Beispielskripts in ASP demonstrieren.

Verschlüsseln einer Datei am Webserver

Das folgende Skript benutzt das NSDPGP Objekt um mittels EncryptFileEx Methode eine Datei zu verschlüsseln.

Die Syntax der EncryptFileEx ist wie folgt:

objPGP.EncryptFileEx PGPKey, "NOSIGN", _
  FileNameSource , FileNameEnc, Passphrase

Der PGPKey Parameter ist die ID eines am Webserver installierten PGP-Schlüssels, der zum Verschlüsseln benutzt wird. FileNameSource ist die zu verschlüsselnde Datei, FileNameEnc der Dateiname, unter dem die verschlüsselte Datei abgespeichert wird. Der Passphrase Parameter schließlich muß die PGP-Verschlüsselungsphrase für den PGP Schlüssel enthalten, ansonsten verschlüsselt EncryptFileEx die Datei nicht.

Um also mittels PGP Schlüssel (ID = 0xB766E886, Passphrase = "Pass") die Datei C:\temp\datei.txt als PGP-verschlüsselte Datei C:\temp\datei.txt.pgp abzuspeichern, benutzt man NSDPGP wie folgt:

objPGP.EncryptFileEx "0xB766E886", "NOSIGN", _
    "C:\temp\datei.txt" , "C:\temp\datei.txt.pgp", "Pass"

Die ID eines Schlüssels können Sie mittels PGPKey Programm (siehe Bild 1) aus der PGP-Programmgruppe im Start-Menü auslesen, indem Sie mit der rechten Maustaste einen Schlüssel wählen und im Kontextmenü auf Key Properties gehen.


Bild 1: PGPKeys Programm

Im erscheinenden Fenster können Sie die Key ID mit der Maus markieren und in den Zwischenspeicher kopieren (siehe Bild 2).


Bild 2: Eigenschaften eines PGP Keys

Um die Anwendung der EncryptFileEx Methode zu veranschaulichen, habe ich folgendes ASP Skript geschrieben (EncryptFile.asp):

<% @LANGUAGE="VBScript" %>
<%
If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
   isPostBack = True
   FileNameSource = Trim(Request.Form("FileNameSource"))
   FileNameEnc = Trim(Request.Form("FileNameEnc"))
   PGPKey = Trim(Request.Form("PGPKey"))
   Passphrase = Trim(Request.Form("Passphrase"))
   DeleteSourceFile = Trim(Request.Form("DeleteSourceFile"))
   
   ' PGP Objekt instanzieren
   Set objPGP = CreateObject("NSDPGP")

   ' Datei mit PGP verschlusesseln:
   ' Syntax: objPGP.EncryptFileEx(EmpfaengerKey, SignKey, _
   '  Quelldatei, PGP_ErgebnisDatei, Passwort)
   objPGP.EncryptFileEx PGPKey, "NOSIGN", _
      FileNameSource , FileNameEnc, Passphrase

   ' Quelldatei loeschen wenn gewuenscht
   If LCase(DeleteSourceFile) = "true" Then
      objPGP.WipeFile(FileNameSource)
   End If
   
   Set objPGP = Nothing
Else
   FileNameSource = "C:\Temp\test.txt"
   FileNameEnc = "C:\Temp\test.txt.pgp"
   PGPKey = "0xB766E886"
   Passphrase = "Pass"
   isPostBack = False
End If
%>

<html>
<body>

<% 
If isPostBack Then
   Response.Write("Die Datei " & _
      Server.HTMLEncode(FileNameSource) & _
      " liegt verschl&uuml;sselt als Datei " & _
      Server.HTMLEncode(FileNameEnc) & _
      " am Webserver!")
   Response.Write("<br><br>")
End If
%>

<form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" method="POST">

Quelldatei (Dateiname der zu verschl&uuml;sselnden Datei):<br>
<input type="Text" name="FileNameSource" value="<%= FileNameSource %>"><br>
<input type="Checkbox" name="DeleteSourceFile" value="True"> 
Quelldatei l&ouml;schen<br><br>

Dateiname der verschlüsselten Datei:<br>
<input type="Text" name="FileNameEnc" value="<%= FileNameEnc %>">
<br><br>

ID des PGP-Schl&uuml;ssel:
<input type="Text" name="PGPKey" value="<%= PGPKey %>"><br>

PGP-Passphrase:
<input type="Text" name="Passphrase" value="<%= Passphrase %>"><br>

<input type="Submit" name="Submit" value="Submit">
</form>

</body>
</html>

Dieses Skript erfragt vom Benutzer die Dateinamen der zu verschlüsselnden und der PGP-verschlüsselten Datei, die Key ID des Schlüssels der zur Verschlüsselung benutzt wird, sowie die Passphrase des Schlüssels.

Mit diesen Daten nimmt das Skript dann die PGP-Verschlüsselung der Datei vor. Außerdem demonstriert das Skript die Verwendung der WipeFile Methode, mit der man Dateien unwiederbringlich von der Festplatte löschen kann.

Natürlich möchte ich Ihnen auch ein Skript zeigen, das eine PGP-verschlüsselte Datei wieder entschlüsselt.

Entschlüsseln einer PGP-verschlüsselten Datei

Das Entschlüsseln einer verschlüsselten Datei gestaltet sich mit der NSDPGP Komponente problemlos. Einfach die DecryptFileEx Methode anwenden, wobei man nur die Namen der verschlüsselten Datei, den Namen der Datei mit dem entschlüsselten Inhalt sowie die PGP-Passphrase für den Verschlüsselungs-Key angeben muß:

objPGP.DecryptFileEx "NOSIGN", _
  FileNameSource , FileNameDec, Passphrase

Natürlich muß dazu auch wieder der PGP-Schlüssel (auch der "Private Key") in den PGPKeys am Webserver vorhanden sein.

Das folgende Skript verschlüsselt eine Datei gemäß den Benutzereingaben:

<% @LANGUAGE="VBScript" %>
<%
If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
   isPostBack = True
   FileNameSource = Trim(Request.Form("FileNameSource"))
   FileNameDec = Trim(Request.Form("FileNameDec"))
   Passphrase = Trim(Request.Form("Passphrase"))
   
   ' PGP Objekt instanzieren
   Set objPGP = CreateObject("NSDPGP")

   ' Datei mit PGP entschlüsseln:
   ' Syntax: objPGP.DecryptFileEx(SignKey, _
   '  PGP_Quelldatei, ErgebnisDatei, Passwort)
   objPGP.DecryptFileEx "NOSIGN", _
      FileNameSource , FileNameDec, Passphrase

   Set objPGP = Nothing
Else
   FileNameSource = "C:\Temp\test.txt.pgp"
   FileNameDec = "C:\Temp\test.txt"
   Passphrase = "Pass"
   isPostBack = False
End If
%>

<html>
<body>

<% 
If isPostBack Then
   Response.Write("Die Datei " & _
      Server.HTMLEncode(FileNameSource) & _
      " liegt entschl&uuml;sselt als Datei " & _
      Server.HTMLEncode(FileNameDec) & _
      " am Webserver!")
   Response.Write("<br><br>")
End If
%>

<form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" method="POST">

Quelldatei (Dateiname der verschl&uuml;sselten Datei):<br>
<input type="Text" name="FileNameSource" value="<%= FileNameSource %>">
<br><br>

Dateiname der entschl&uuml;sselten Datei:<br>
<input type="Text" name="FileNameDec" value="<%= FileNameDec %>">
<br><br>

PGP-Passphrase:<br>
<input type="Text" name="Passphrase" value="<%= Passphrase %>">
<br><br>

<input type="Submit" name="Submit" value="Submit">
</form>

</body>
</html>

Schlußbemerkung

PGP ist der wohl am meisten verbreitete Standard zum Verschlüsseln von Nachrichten und Dateien. Mit Hilfe der NSDPGP Komponente ist es möglich, Dateien von ASP (oder einer anderen COM-Umgebung) mit PGP zu ver- und zu entschlüsseln.

This printed page brought to you by AlphaSierraPapa

Download des Codes

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

Verwandte Artikel

Aber bitte mit Rijndael
http:/www.aspheute.com/artikel/20010528.htm
CAPICOM One
http:/www.aspheute.com/artikel/20020115.htm
Mit PGP verschlüsselte e-Mails senden
http:/www.aspheute.com/artikel/20000912.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
Unknackbare Verschlüsselung mit Onetime Pads
http:/www.aspheute.com/artikel/20010924.htm
Ver- und entschlüsseln von Texten mit PGP
http:/www.aspheute.com/artikel/20000921.htm

Links zu anderen Sites

NSDPGP
http://community.wow.net/grt/nsdpgp.html
PGPi Software
http://www.pgpi.org

 

©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.