cgicorner.ch

Informationen rund um Perl/CGI

Sie sind hier: Home > Knowledge Base > Ver- und Entschlüsselung eines Strings

Ver- und Entschlüsselung 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:

###########################################################################
# Verschlüsselt einen Text: $verschluesselt=&jsCrypt("text","key");
sub jsCrypt {
  my $tmpCrypted1="";
  my $tmpText=$_[0]; # 1. Argument: Text zum verschlüsseln
  my $tmpKey=$_[1];  # 2. Argument: Schlüssel
  # Schlüssel auf Länge des Textes bringen (hintereinanderkopieren)
  $tmpKey = $tmpKey x (length($tmpText) / length($tmpKey) + 1);
  $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;
}
###########################################################################
# Entschlüsselt einen Text: $entschluesselt=&jsEncrypt("verschluesselt","key");
sub jsDecrypt {
  my $tmpText=$_[0];  # 1. Argument: Text zum entschlüsseln
  my $tmpKey=$_[1];  # 2. Argument: Schlüssel
  $tmpText =~ tr/+/ /;  # + durch Leerzeichen ersetzen
  # Sonderzeichen entschlüsseln
  $tmpText =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  # Schlüssel auf Länge des Textes bringen (hintereinanderkopieren)
  $tmpKey = $tmpKey x (length($tmpText) / length($tmpKey) + 1);
  $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;
}

Weiterführende Links

Autor: Jürg Sommer, knowledge@cgicorner.ch

[ zurück ]