[Quiz #11] chmee [php]

chmee

verstaubtes inventar
Premium-User
Ach ja, Matthias, dann bin ich wieder dabei..

Stufe 1

Verschiebechiffre - Nun, erstmal wieder Gedankentheorie. Eine einfache Verschiebung ist ja recht schnell zu entlarven und im zweiten Schritt auch recht schnell geknackt. Auf Wortebene (dass, was man da liest), ist der chiffrierte Text sinnlos. Aber die "erste" Ableitung sozusagen, nämlich der Abstand der Buchstaben zueinander (zB ASCII) macht die Sache schon recht einfach und oft benutzte Wörter kann man recht schnell wiederfinden. Ist ein Wort gefunden, kann die Verschiebung auf den Rest angewandt werden.

Also zB ich + 4 = mgl -> 1.Ableitung -> 20,5 oder auch -6,-21 oder auch -6,5 oder auch 20,-21

Kommata und Leerzeichen sind für den Bestimmungsprozess unerheblich. Man nimmt sich quasi "verpflichtende" Worte, die in einem Absatz vorkommen werden.

zB Ich, sie, der, die, und, oder, kann, werde

Nachher weiter :D mfg chmee
 
So, hier also die höchst chaotische php-Variante zu Aufgabe 1, die sogenannte Version 1:
PHP:
<?php
// Wortwendungen auf welche überprüft wird.
$sw=array("mich","sch","mein","ich","cht","der","den","du","ch","ab","ue","ae","oe","in");
$swAbl=array();
$diff=array();

//Originaltext
$textOrig="
'ulu tlaly g'ybljr
'ulu tlaly vip
'ulu tlaly hbmp
qlaga zhbmp";

$textAbl="";

// alle nicht-Buchstaben löschen
$pattern = '/[^a-z]+/';
$text = preg_replace($pattern,"", $textOrig);

//erste Ableitung des Orig-Texts
for($i=0;$i<(strlen($text)-1);$i++)
{
  $di=97+ord($text{$i})-ord($text{$i+1});
  if($di<97) {$di=$di+26;}
  if($di>122) {$di=$di-26;}
  $textAbl=$textAbl.chr($di);
}

//erste Ausgabe
echo "Originaltext :<br/>".$text."<br/><br/>";
echo "Ableitung :<br/>".$textAbl."<br/><br/>";

//Ableitung der Suchbegriffe
echo "Ableitung der Suchbegriffe :<br/>";

foreach( $sw as $swA )
{
  $swtemp="";
  for($i=0;$i<(strlen($swA)-1);$i++)
  {
	$di=97+ord($swA{$i})-ord($swA{$i+1});
	if($di<97) {$di=$di+26;}
	if($di>122) {$di=$di-26;}
	$swtemp=$swtemp.chr($di);
  }
  $swAbl[]=$swtemp;
  echo $swA." -> ".$swtemp."<br/>";
}
echo "<br/>";

//Vergleich
for($i=0;$i<count($swAbl);$i++)
{
  $posA=strrpos($textAbl,$swAbl[$i]);
  if($posA!==FALSE)
  {
    echo $swAbl[$i]." (".$sw[$i].") an Stelle ".$posA." gefunden.";
    $differenz = ord($text{$posA})-ord($sw[$i]{0});
    echo " --> Differenz : ".$differenz."<br/>";
    $diff[]=$differenz;
  }
}

echo "<br/>";
echo "mögliche Ergebnisse :";
echo "<br/>";

//Ausgabe
foreach($diff as $d)
{ 
  echo $d." -> ";
  for($i=0;$i<strlen($text);$i++)
  { 
   $char=ord($text{$i})-$d;
   if($char<97){$char=$char+26;}
   if($char>122){$char=$char-26;}
   echo chr($char);
  }

echo"<br/>";
}
?>
Und kommt mir bloß nicht mit Dialekt-Deutsch. Alder Schwede, das war gemein.
 
Ein anderer Ansatz könnte über die Häufigkeit von Buchstaben gehen.

Welcher kodierte Buchstabe kommt am Häufigsten vor, dieser "müsste" einem der häufig vorkommenden Buchstaben in der deutschen Sprache entsprechen.

http://de.wikipedia.org/wiki/Buchstabenhäufigkeit

E - ~17,4%
N - ~9,8%
I - ~7,5%
S - ~7,3%
R - ~7%

:D Naja, werd ich auch gleich noch umsetzen.

:edit: Ich fasse nochmal zusammen:

Version 1 : Oben aufgeführt und erläutert. Über die Ableitung häufige Worte finden.

Version 2 : Wie eben beschrieben, über die Buchstabenhäufigkeit zum Ziel kommen.

Version 3 : Die einfachste, bei der geringen Zahl von Möglichkeiten (25) einfach alle durchgehen, und schauen, wo ein deutsches Wort enthalten ist ( Wortliste aus V1)
 
Version 2 : Über die Buchstabenhäufigkeit entschlüsseln:
PHP:
<?php
$sw=array("e","n","i","s","r");

$textOrig="xfcu leu jzcsvi czvs zty jvyi,
bree'j rlty nfyc xvsirltyve,
yrvkk zty ufty vze xreqvj dvvi,
dzty urivze ql krltyve.";

// alle nicht-Buchstaben löschen
$pattern = '/[^a-z]+/';
$textOrig = preg_replace($pattern,"", $textOrig);

//Häufigsten Buchstaben suchen
for($i=0;$i<strlen($textOrig);$i++)
{
 $stelle=ord($textOrig{$i});
 $buchstaben[$stelle]=$buchstaben[$stelle]+1;
}

// größtes Vorkommen finden
$tmpval=0;
foreach($buchstaben as $key=>$value)
{
 if($value>$tmpval)
 {
   $tmpval=$value;
   $tmpkey=$key;
 }
}

//Die möglichen Ergebnisse
foreach($sw as $correctLetter)
{
 $diff=$tmpkey-ord($correctLetter);
 echo $diff." - ";
 for($i=0;$i<strlen($textOrig);$i++)
 {
   $tmpChar=ord($textOrig{$i});
   $tmpChar=$tmpChar-$diff;
   if($tmpChar<97){$tmpChar=$tmpChar+26;}
   if($tmpChar>122){$tmpChar=$tmpChar-26;}
   echo chr($tmpChar);
 }
 echo"<br/>";
}
?>
 
Ach ja, bevor es zu Unkenrufen kommt : Natürlich könnte man aus den möglichen Ergebnissen das richtige herausfiltern, wenn man nochmals einen Vergleich mit den Wort-Teilen aus V1 macht.

Stufe 2 laß ich mal sein, dass würde mich zuviel Zeit und Hirn kosten :D

mfg chmee
 
Zurück