Cifru de tip Caesar
Stefanescu Mihai 9 months ago SecurityCifrul de tip Cezar este una dintre primele si cele mai simple metode de cifrare. Este un cifru de substitutie, adica fiecare litera unu text dat este inlocuita cu o litare aflata la un anumit numar de pozitii de ea in alfabet. De exemplu, daca am lua ca exemplu numarul de pozitii 1, litera A va fi inlocuita de litera B, litera B va fi inlocuita de litera C sia asa mai departe. Aceasta tehnica a fost numita dupa Iulius Cezar, pentru ca se spune ca asa vorbea (in scrisori) cu oamenii lui.
Deci, acest tip de cifru are nevoie de un text si un int care sa indice numarul de caractere cu care sa schimbe pozitia fiecarei litere. Acest tip de criptare poate fi reprezentat si printr-o formula matematica transformand literele in numere, conform schemei A = 0, B = 1, ... Z = 25. Criptarea unei litere poate fi descrisa in mod matematic astfel:
En(x) = (x+n)mod26
iar decriptarea
Dn(x) = (x-n)mod26
Exemple:
Text : ABCDEFGHIJKLMNOPQRSTUVWXYZ
Shift: 23
Cifru: XYZABCDEFGHIJKLMNOPQRSTUVW
Text : ATTACKATONCE
Shift: 4
Cifru: EXXEGOEXSRGI
Algortmul pentru criptare
Date de intrare:
1. un string cu litere mici
2. un int in intervalul 0-25 ce reprezinta shift-ul de caractere
Procedura:
1. iteram prin textul data caracter cu caracter
2. pentru fiecare caracter, transformam caracterul conform regulilor, in functie de tipul actiuni, criptare sau decriptare
3. intoarcem noul string generat
Un exemplu de asemenea program:
<?php // Un program PHP ce ilustreaza tehnica // Caesar Cipher de criptare // Functia primeste un string si un int pentru numarul de pozitii function caesarCipher($textToEncrypt, $shiftPositionsNumber = 13) { // Literele alfabetului $letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Pozitia noua $shiftPositionsNumber = (int)$shiftPositionsNumber % 26; // Daca nu avem o pozitie noua, iesim din functie cu string-ul dat if (!$shiftPositionsNumber){ return $textToEncrypt; } // Ne asiguram ca daca pozitia este negativa ne uitam in randul numerelor pozitive if ($shiftPositionsNumber < 0) { $shiftPositionsNumber += 26; } // Daca trebuie sa shiftam numele cu 13 pozitii folosim functia existenta in PHP if ($shiftPositionsNumber == 13) { return str_rot13($textToEncrypt); } // Inlocuirea efectiva a caracterelor $rep = substr($letters, $shiftPositionsNumber * 2) . substr($letters, 0, $shiftPositionsNumber * 2); return strtr($textToEncrypt, $letters, $rep); } // Executia $text = "INVATAPROGRAMARE"; $s = 13; echo "Text : " . $text; echo "\nShift: " . $s; echo "\nCifru: " . caesarCipher($text, $s);
iar rezultatul acestui program va fi:
Text : INVATAPROGRAMARE
Shift: 13
Cifru: VAINGNCEBTENZNER
Cum decriptam?
Putem fie sa folosim alta functie pentru decriptare, fie putem folosi proprietatea ciclica a cifrului sub modul, de unde putem observa
Cifru(n) = De-Cifru(26-n)
Deci, putem folosi aceasi frunctie pentru descriptare.