|
|
Ver- und entschlüsseln von Texten mit PGP
Geschrieben von: Christian Koller 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 TexteDamit 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üsselte Text lautet:" & _
"</b><BR><br>")
Response.Write("<pre>" & strPGPText & "</pre>")
Else
Response.Write("Es ist ein Fehler aufgetreten, " & _
"der Text konnte nicht verschlüsselt werden!<BR>")
End If
Response.Write("<BR>")
Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _
""">Zurü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.
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.
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 TexteAuf 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üsselte Text lautet:</b>" & _
"<BR><br>")
Response.Write("<pre>" & strDecText & "</pre>")
Else
Response.Write("Es ist ein Fehler aufgetreten, " & _
"der Text konnte nicht entschlüsselt werden!<BR>")
End If
Response.Write("<BR>")
Response.Write("<a href=""" & Request.ServerVariables("SCRIPT_NAME") & _
""">Zurü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).
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.
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ßbemerkungDas 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Aber bitte mit Rijndael Links zu anderen SitesWenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |