Henryk Plötz: Wie String Ver- und Entschlüsseln?

Beitrag lesen

Moin,

ich war jetzt etwas faul mir die antwort hier genau durchzulesen, aber
ich hatte schonmal ähnliches "problem". So hab ich es gelöst.

Danke für deine Mühe, aber solchen Code kann ich hier nicht unkommentiert stehen lassen. Das Fragment ist etwas merkwürdig, riecht aber nach einer Caesar-Chiffre, eine Sonderform einer monoalphabetischen Substitution. Davon sollte man vor allem eines halten: Abstand. Dabei bleibt die Struktur der Eingabe erhalten, so dass man selbst im allgemeinen Fall sehr leicht über die Zeichenhäufigkeiten den Schlüssel erraten kann (sowas findet man auch manchmal als Rätsel in der Zeitung, neben dem "Farbe mit 3 Buchstaben"-Kreuzworträtsel).

Speziell bei der Caesar-Chiffre fängt man sich noch zusätzlich das Problem, dass man selbst ohne Computer und per Hand alle möglichen Schlüssel in kurzer Zeit durchprobiert hat.

Zum Code:

$Text = $_POST['text'];
    $lang = strlen($Text);
    $TextteilCode = false;
    echo "Text: $Text<br>";
    for ($z=0; $z<$lang; $z++)
    {
      $Textteil = substr($Text, $z);
      $Textteil = ord($Textteil);
      $Code = "~";
      $Code = ord($Code);
      $TextteilCode[$z] = $Textteil+$Code;
    }

  
Diese Schleife soll offenbar einen Schlüssel auf den Zeichenwert aller Buchstaben im Text aufaddieren. Das müsste aber so in moderneren PHP-Versionen mindestens eine Warnung produzieren, weil $TextteilCode als Boolean initialisiert aber später als Array angesprochen wird. Auf jeden Fall ist es äusserst schlechter Stil. Auch ist es unnötig langsam, wenn man substr() benutzt, um einzelne Zeichen rauszupicken. Die »$Code = "~"; $Code = ord($Code);«-Zeilen sind weitgehend überflüssig, zumal sie nicht dem Verständnis dienen.  
  
Die gesamte Schleife oben lässt sich eindampfen zu  
~~~php
  
$TextteilCode = Array();  
for($=0; $z<$lang; $z++) {  
    $TextteilCode[$z] = $Text{$z} + 126;  
}  

if ($TextteilCode <> false)
    {
      $anzahl = count($TextteilCode);
      $TextCodiert ="";

  
Beim if sollte man jetzt besser auf »count($TextteilCode) > 0« prüfen.  
  

> ~~~php
  

>       for ($z=0; $z<$anzahl; $z++)  
>       {  
>         $TextCodiert .= $TextteilCode[$z];  
>       }  
>       echo "Textgewandelt: $TextCodiert<br>";  
> 

Das gibt zwar eine schöne Ausgabe, bringt aber nicht so viel da der ausgegebene Text nicht weiter verarbeitet wird. Sinnvoll im Rahmen des verbreiteten Algorithmus wäre zum Beispiel sowas wie

  
for($z=0; $z<$anzahl; $z++) {  
    $TextCodiert .= chr($TextteilCode[$z] % 256);  
}  

(was man natürlich gleich mit der obigen Schleife zusammenzieht)

$TextDecode = "";
      for ($z=0; $z<$anzahl; $z++)
      {
        $Textteil = $TextteilCode[$z];
        $Code = "~";
        $Code = ord($Code);
        $Decoded = $Textteil - $Code;
        $Decoded = chr($Decoded);
        $TextDecode .= $Decoded;
      }// for ($z=0; $z<$anzahl; $z++)

  
Hier gilt das gleiche wie oben (in der Form unnötig komplex, »$TextDecode .= chr($TextteilCode[$z] - 126);« würde reichen), bzw. mit der veränderten Form:  
  
~~~php
  
$TextDecode = "";  
for($z=0; $<$anzahl; $z++) {  
    $TextDecode .= chr( (ord($TextCodiert{$z}) + 256 - 126) % 256 );  
}  

Die %256 sorgt in den beiden Fällen übrigens dafür dass die entstehenden Zeichencodes innerhalb des gültigen 8-Bit-Bereichs bleiben.

echo "Decodiert: $TextDecode";
    }// if ($TextteilCode <> false)


-- 
Henryk Plötz  
Grüße aus Berlin  
~~~~~~~~ Un-CDs, nein danke! <http://www.heise.de/ct/cd-register/> ~~~~~~~~  
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~