Chciałbym zaprezentować prosty, popularny szyfr Cezara. Idea szyfru polega na podstawieniu pod litery alfabetu jawnego, litery alfabetu zaszyfrowanego.
Alfabet zaszyfrowany to taki, który jest przesunięty o ilość liter. Przesuwać można w lewo lub w prawo – a sam alfabet się zatacza, tzn:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z oto alfabet jawny.
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C oto alfabet zaszyfrowany.
Jak widać przesuniecie jest równe 3. W tym przykładzie przesuwam w lewo, usuwając 3 pierwsze litery i wstawiając je na koniec alfabetu.
Oto skrypt w PHP, który zaszyfruje tekst, szyfrem Cezara:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <?php class SzyfrCezara { private $alfabet; private $przesuniec; public function __construct($iloscPrzesuniec){ for($a = ord('A'); $a<=ord('Z'); $a++) { $this->alfabet[chr($a)]=chr($a); } $this->przesuniec=$iloscPrzesuniec; } private function stworzAlfabet(){ $szyfr; foreach($this->alfabet as $litera) { $szyfr[$litera] = chr(65+(ord($litera)-(65-$this->przesuniec)) % 26 ); } return $szyfr; } public function szyfruj($tekst){ $tekst= str_split( strtoupper($tekst) ); $szyfr = $this->stworzAlfabet(); $nowyTekst=""; foreach((array)$tekst as $litera) $nowyTekst.=$litera==" "?" ":$szyfr[$litera]; return $nowyTekst; } public function odszyfruj($tekst){ $deszyfr = array_flip($this->stworzAlfabet()); $tekst= str_split( strtoupper($tekst) ); $nowyTekst=""; foreach((array)$tekst as $litera) $nowyTekst.=$litera==" "?" ":$deszyfr[$litera]; return $nowyTekst; } } $txt='testujemy'; $t = new SzyfrCezara(3); $zaszyfrowany = $t->szyfruj($txt); echo 'Szyfrujemy: '.$txt.'<br>'; echo 'Zaszyfrowany: '.$zaszyfrowany.'<br>'; echo 'Odszyfrowany '.$t->odszyfruj( $zaszyfrowany ); |
W konstruktorze podajemy długość przesunięcia. A metoda szyfruj() – zwraca zaszyfrowany tekst.
Metodą odszyfruj możemy odszyfrować tekst :)
Pozdrawiam!
Mateusz Mazurek