[PHP] Encoding Map
<?php
//Test
$flag = false;
echo "<b>Input:</b><br />\n";
echo $text = "Hallo Welt,<br />\nhallo zum 2'ten";
echo "<hr />\n";
echo "<b>Verschlüsselt:</b><br />\n";
echo $encryptedText = Map::encrypt($text, $flag);
echo "<hr />\n";
echo "<b>Entschlüsselt:</b><br />\n";
echo Map::decrypt($encryptedText, $flag);
class Map{
const C_FLAG_DEFAULT = false;
//Pseudo-Hexwerte immer Gross
//Die Werte sollten über '7F' liegen, damit keine Probleme auftauchen
//Die Extendes ASCII-Codes werden so zwar überschrieben, aber diebraucht man eh fast nie. Ansonsten
//sollte der Wert halt über 'FF' liegen. Hier sind auch Werte wie 'GF' etc. zulässig
protected static $map = array('h' =>'F1', 'H' => 'A1', 'd' => '9F', 'e' => 'EF');
protected static $switcher = C_FLAG_DEFAULT;
protected static $cruptFunc = '';
/**
* verschlüsselt einen Text
* @static
* @param String $text zu verschlüsselnder Text
* @param Boolean $flag Flag, true oder afalse der mitgegeben werden kann.
* Dieser beinflusst den Switcher. Zum verschlüssen und entschlüsseln muss
* der gleiche Wert verwendet werden!
* Default ist false
* @return String Verschlüsselter Text
*/
public static function encrypt($text, $flag = self::C_FLAG_DEFAULT){
return self::convert(str_split($text), $flag, 'encryptLetter');
}
/**
* entschlüsselt einen Text
* @static
* @param String $string Verschlüsselter Text
* @param Boolean $flag Flag analog zum Parameter $flag von encrypt
*/
public static function decrypt($string, $flag = self::C_FLAG_DEFAULT){
return self::convert(str_split($string, 2), $flag, 'decryptLetter');
}
/**
* setzt die Initial-Parameter und ruft über alle Elemente die Ver/Entschlüsselung auf
* @static
* @param Array<String> $array
* @param Boolean $flag
* @param String $func
* @return String
*/
protected static function convert($array, $flag, $func){
self::$switcher=$flag;
self::$cruptFunc = $func;
//Alle Elemente des Arrays zusammenführen
return array_reduce($array, array(self, 'reduce'));
}
/**
* Funktion zum ver-/entschlüsseln und zusammenfügen aller Buchstaben
* Diese Callback-Funktion wird für array_reduce() verwendet
* @static
* @param String $a 1. Buchstabe
* @param String $b 2. Buchstabe
* @return String zusammengehängte Buchstaben
*/
protected static function reduce($a, $b){
return $a. call_user_func(array(self, self::$cruptFunc), $b, self::$switcher = !self::$switcher);
}
/**
* Verschlüsseln eines Buchstabens
* @static
* @param String $letter Entschlüsselter Buchstabe
* @param Boolean $reverse
* @return String Verschlüsselter Buchstabe
*/
protected static function encryptLetter($letter, $reverse=false){
//prüfen ob der Buchstabe im map-array ist. Wenn ja, diesen Wert nehmen. Ansonsten den Hex-Wert
$hex = array_key_exists($letter, self::$map) ? self::$map[$letter] : strtoupper(dechex(ord($letter)));
//Sicherstellen dass der String 2 Zeichen lang ist. 'A' -> '0A'
$hex = str_pad($hex, 2, '0', STR_PAD_LEFT);
//Hex-Wert umkehren
return $reverse ? strrev($hex) : $hex;
}
/**
* entschlüsseln eines Buchstabens
* @static
* @param String $hex Verschlüsselter Buchstabe
* @param Boolean $reverse
* @return String Entschlüsselter Buchstabe
*/
protected function decryptLetter($hex, $reverse = false){
//Hex-Wert umkehren
$hex = strtoupper($reverse ? strrev($hex) : $hex);
//Im map-array suchen und ggf passenden Wert zurückgeben. Ansonsten den Hexwert zurückwandeln
return ($letter = array_search($hex, self::$map)) ? $letter : chr(hexdec($hex));
}
}
?>