|
|
|||||||
![]() |
Ver- und Entschluesselung eines Strings
Ein String sollte für die Übermittlung verschlüsselt sein, muss jedoch wieder im Klartext lesbar sein können (z.B. Weitergabe eines Passworts an eine externe Seite, POP3-Kommunikation etc.). Dadurch lässt sich keine Einweg-Verschlüsselung wie crypt verwenden.
Folgende Subroutinen ver- und entschlüsseln einen beliebigen String. Dabei wird eine XOR-Verknüpfung mit einem geheimen Key verwendet. Untenstehendes Beispiel basiert auf einem iX-Artikel aus dem Jahr 1999. Der Link zum entsprechenden Artikel in der Online-Ausgabe findet man am Ende dieser Dokumentation. Dort wird das Verfahren auch ausführlich erklärt. Ich habe das Script soweit abgeändert, so dass zwei Subroutinen den Inhalt einer Variable ver- bzw. entschlüsseln. Dabei wird der verschlüsselte Text noch so codiert, dass er sich auch an die URL angehängt an eine andere Seite weitergeben lässt. Die Verschlüsselung kann reicht für primitivere Sachen sicher aus. Die Verschlüsselung gilt solange als relativ sicher, als dass nur einer der drei Werte (Klartext, verschlüsselter Text, Secret-Key) bekannt sind. Sobald zwei der drei Werte bekannt sind, kann der dritte Wert mühelos innert Sekundenbruchteilen herausgefunden werden. So kann z.B. der Secret-Key ausgelesen werden, wenn der Benutzer in der Lage ist, selber einen Text zu verschlüsseln (Klartext und verschlüsselter Text bekannt --> Secret Key lesbar). Für die Ver- und Entschlüsselung sind zwei Funktionen notwendig:
$verschluesselt=&jsCrypt("geheimer Text","secretkey");
$entschluesselt=&jsDecrypt($verschluesselt,"secretkey");
Nun aber das Codebeispiel inkl. Kommentar:
###########################################################################
sub jsCrypt { # Verschlüsselt einen Text: $verschluesselt=&jsCrypt("text","key");
my $tmpCrypted1="";
my $tmpText=$_[0]; # 1. Argument: Text zum verschlüsseln
my $tmpKey=$_[1]; # 2. Argument: Schlüssel
$tmpKey = $tmpKey x (length($tmpText) / length($tmpKey) + 1); # Schlüssel auf Länge des Textes bringen (hintereinanderkopieren)
$tmpKey = substr($tmpKey, 0, length($tmpText)); # ... und kürzen
my $tmpCrypted=$tmpText ^ $tmpKey; # XOR-Verknüpfung zwischen Text und Key
$tmpCrypted=&URIencode($tmpCrypted); # Verschlüsselten Text für URL codieren
return $tmpCrypted;
}
###########################################################################
sub jsDecrypt { # Entschlüsselt einen Text: $entschluesselt=&jsEncrypt("verschluesselt","key");
my $tmpText=$_[0]; # 1. Argument: Text zum entschlüsseln
my $tmpKey=$_[1]; # 2. Argument: Schlüssel
$tmpText =~ tr/+/ /; # + durch Leerzeichen ersetzen
$tmpText =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # Sonderzeichen entschlüsseln
$tmpKey = $tmpKey x (length($tmpText) / length($tmpKey) + 1); # Schlüssel auf Länge des Textes bringen (hintereinanderkopieren)
$tmpKey = substr($tmpKey, 0, length($tmpText)); # ... und kürzen
my $tmpCrypted=$tmpText ^ $tmpKey; # XOR-Verknüpfung zwischen Text und Tex
return $tmpCrypted;
}
###########################################################################
sub URIencode { # Codiert einen Text URL-freundlich
my $text=$_[0];
my ($i,$char);
my $returnText="";
for ($i=0;$i<length($text);$i++) { # zeichenweise Verarbeitung
$char=substr($text,$i,1); # aktuelles Zeichen bestimmen
if ($char =~ m/[a-zA-Z0-9]/) { # Buchstabe oder Zahl --> 1:1 zurückgeben
$returnText.=$char;
} elsif ($char eq " ") { # Leerzeichen --> in + umwandeln
$returnText.="+";
} else { # andere Sonderzeichen: Hex-Codierung
$char=sprintf "%X", ord($char);
if (length($char)==1) { # einstellige Hex-Zahl zweistellig machen
$char="0".$char;
}
$returnText.="%".$char; # % voranstellen
}
}
return $returnText;
}
Dieser Artikel wurde zugesandt von: Jürg Sommer, knowledge@cgicorner.ch Weiterführende Links:
|
||||||